来源:刘汝佳《算法竞赛入门经典--训练指南》 P60 问题1:
问题描述:有一个非负整数组成的三角形,第一行只有一个数,除了最下行之外,每个数的左下方和右下方各有一个数。从第一行的数开始,每次可以往左下或右下走一格,直到走到最下一行,把沿途经过的数全部加起来,如何走可使这个和最大?
分析:对于三角形中的每个位置[i][j],以[i][j]为顶点的三角形的最大路径值只可能来自他左下方的数或者右下方的数。
设d[i][j]为从格子(i,j)出发能得到的最大和,则状态转移方程:
d[i][j] = a[i][j] + Max{d[i+1][j] , d[i+1][j+1]};
例题来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=18
代码实现:
1 2 #include "stdio.h" 3 #include "string.h" 4 5 #define N 105 6 7 int ans[N][N]; 8 9 inline int MAX(int a,int b){ return a>b?a:b; } 10 11 int main() 12 { 13 int n; 14 int i,j; 15 while(scanf("%d",&n)!=EOF) 16 { 17 for(i=1; i<=n; ++i) 18 { 19 for(j=1; j<=i; ++j) 20 scanf("%d",&ans[i][j]); 21 } 22 for(i=n-1; i>=1; i--) 23 { 24 for(j=1; j<=i; ++j) 25 ans[i][j] += MAX(ans[i+1][j],ans[i+1][j+1]); 26 } 27 printf("%d ",ans[1][1]); 28 } 29 return 0; 30 } 31