题目大意:
输入一个数字金字塔,求从塔尖到塔底的一条路径,使这条路径上的元素和最大。
解题思路:
简单的动态规划问题,对于一个2层的塔,求最大的路径就是把第一层的每个路径都计算一遍,比较最大值。然后推广到一个N层高的塔,从第N-1层到第N层的路径同2层塔一样,计算N-1层到下一层两个点的路径最大值,保存在N-1层的点里,这样就把N层塔问题转化为N-1层塔问题,重复压缩直到塔尖,这时塔尖的值就是最大路径和。
程序代码:
#include<stdio.h>
#define N 1005
int data[N][N];
int n;
int max(int x,int y)
return x>y?x:y;
}
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++)
scanf("%d",&data[i][j]);
}
for(int i=n-2;i>=0;i--){ //从倒数第二层开始压缩
for(int j=0;j<=i;j++){
//计算第 i 层每个点到第 i+1 层的最大路径和
data[i][j]+=max(data[i+1][j],data[i+1][j+1]);
}
}
printf("%d\n",data[0][0]);
}
}