问题描述 :
考虑在下面被显示的数字金字塔(第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>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int max(int a,int b){
if(a>b){
return a;
}else{
return b;
}
}
int main(int argc, char *argv[]) {
int r,i,j;
scanf("%d",&r);
int temp[r][r];
int transfer[300];
for(i=0;i<r;i++){
for(j=0;j<=i;j++){
scanf("%d",&temp[i][j]);
}
}
for(i=0;i<r;i++){
transfer[i]=temp[r-1][i];
}
for(i=r-2;i>=0;i--){
for(j=0;j<i+1;j++){
//每次那正下和右下中最大的加上此行的数值
transfer[j]=max(transfer[j],transfer[j+1])+temp[i][j];
}
}
//输出第一个为最大值
printf("%d\n",transfer[0]);
return 0;
}