Description:
考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。 每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
Input:
第一行输入测试数据的组数T; 接下来每组测试数据: 第一个行包含 R(1<= R<=1000) ,表示行的数目。 后面每行为这个数字金字塔特定行包含的整数。
Output:
对每组数据输出最大值
Sample Input:
1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output:30
解题思路:
用递推的方法来做,应为本行的最大值只与下一行有联系,所以用二维数组倒着推算出结果
if(a[i][j] > a[i][j+1])
a[i-1][j] += a[i][j];
else
a[i-1][j] += a[i][j+1];
整体代码:
#include<stdio.h> void main() { int t; scanf("%d",&t); while(t--) { int i,j,r,a[100][100]; scanf("%d",&r); for(i=0;i<r;i++) { for(j=0;j<=i;j++) { scanf("%d",&a[i][j]); } } for(i=r-1;i>=0;i--) { for(j=0;j<=i;j++) { if(a[i][j]>a[i][j+1]) a[i-1][j]+=a[i][j]; else a[i-1][j]+=a[i][j+1]; } } printf("%d\n",a[0][0]); } }