1625 数字金字塔
1625 数字金字塔
链接:http://codevs.cn/problem/1625/
USACO
时间限制: 1 s
空间限制: 128000 KB
题目描述 Description
考虑在下面被显示的数字金字塔.
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大.
每一步可以走到下方的点也可以到达右下方的点.
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从 7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入描述 Input Description
第一个行包含 R(1<= R<=1000) ,表示行的数目.
后面每行为这个数字金字塔特定行包含的整数.
所有的被供应的整数是非负的且不大于 100
输出描述 Output Description
单独的一行包含那个可能得到的最大的和.
样例输入 Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出 Sample Output
30
数据范围及提示 Data Size & Hint
题解:h[i][j]存该点数值, f[i][j]存从底部到该点的最大和,为该点值+Max(该点正下方最大和,该点斜下方最大和),即
f[i][j]=max(f[i+1][j]+h[i][j],f[i+1][j+1]+h[i][j]);
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int h[1005][1005],f[1005][1005]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&h[i][j]); for(int j=1;j<=n;j++)f[n][j]=h[n][j]; int i=n; while(i>1){ i--; for(int j=1;j<=i;j++) f[i][j]=max(f[i+1][j]+h[i][j],f[i+1][j+1]+h[i][j]); } cout<<f[1][1]<<endl; }