72 数字金字塔
问题描述 :
考虑在下面被显示的数字金字塔(第n行有n列)。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每前进一步可以走到它的正下方或者右下方(往下一行、往右一列)的位置。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入说明 :
第一个行包含 R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。
输出说明 :
输出仅一行,包含那个可能得到的最大的和。
输入范例 :
6
7
3 8
8 1 0
2 7 4 100
4 5 2 6 5
3 2 5 8 7 6
输出范例 :129
思想:保存一个数组用于更新每一层对上一层累加的结果,这样可以照顾到每一个数据,初始等于末行的数值,然后更新,每一个值等于本行当前数字和下一个数字中的最大值,加上正上方的数字(保证更新规则是向下和向右下)。
#include <stdio.h> #include <stdlib.h> #include <math.h> int max(int a,int b){ if(a>b){ return a; }else{ return b; } } int main() { int num, i, j, k, count; scanf("%d",&num); int nums[num][num]; int res[num]; count = 0; for(i=0;i<num;i++){ for(j=0;j<=i;j++){ scanf("%d",&nums[i][j]); } } for(i = 0;i<num;i++){ res[i] =nums[num-1][i]; } for(i = num-2;i>=0;i--){ for(j =0;j<=i;j++){ res[j] = max(res[j],res[j+1])+nums[i][j]; } } printf("%d\n",res[0]); }