P1216 数字三角形(洛谷刷题记)
题目
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
7 3 8 8 1 0 2 7 4 4
4 5 2 6 5
范围
1 <= n <= 1000,所有输入数在区间 [0,100] 内
分析
对于每个数来说,它只能来自于它的左上角那个数以及正上方那个数,故只需要将这二者取 max 即可,最后再将计算所得的最后一行所有结果取 max 即可。
代码
#include<bits/stdc++.h>
using namespace std;const int N = 1010;
int n;
int a[N][N] = {0};
int f[N][N] = {0};int main()
{cin >> n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin >> a[i][j];f[i][j] = a[i][j];f[i][j] = a[i][j] + max(f[i-1][j],f[i-1][j-1]);}}int res=0;for(int i=1;i<=n;i++)res = max(res,f[n][i]);cout << res << endl;return 0;
}
原题链接 洛谷 P1216 数字三角形