问题描述 (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大。 ●每一步可沿左斜线向下或右斜线向下走; ●1<三角形行数≤100; ●三角形中的数字为整数0,1,…99; 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5. (图3.1-1) 输入格式 文件中首先读到的是三角形的行数。 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 样例输出 30
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #define LEN 100 4 #define MAX(X,Y) (X)>(Y)?(X):(Y) 5 6 int main(void) 7 { 8 int n,i,j,res; 9 int dp[LEN+1][LEN+1]; 10 memset(dp,0,sizeof(dp)); 11 scanf("%d",&n); 12 13 for (i=0 ; i<n ; i++) 14 { 15 for (j=0 ; j<=i ; j ++) 16 { 17 scanf("%d",&dp[i][j]); 18 if (i>0) //每行的数据依次添加上方或左上方中的最大值 19 { 20 if (j==0) 21 dp[i][j] += dp[i-1][j]; 22 else 23 dp[i][j] += MAX(dp[i-1][j],dp[i-1][j-1]); 24 } 25 } 26 } 27 res = dp[n-1][0]; 28 for (i=1 ; i<n ; i++)//遍历最后一行中的最大值 29 if (dp[n-1][i] > res) 30 res = dp[n-1][i]; 31 32 printf("%d",res); 33 return 0; 34 } 35
解题思路:
从第二行开始,每个数据分别添加上方及左上方中的最大值(即走左下角的路和右下角的路)
最后查找最后一行中的最大值