下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。
7
3 8
8 1 0
2 7 4 4
1. 每一步可沿左斜线向下或右斜线向下走;
2. 1<=三角形行数<=100
3. 三角形中的数字为整数 0,1,……,99。
4. 如果有多种情况结果都最大,任意输出一种即可。
输入:
第一行一个整数N,代表三角形的行数。
接下来N行,描述了一个数字三角。
输出:
第一行一个整数,代表路径所经过底数字总和。
第二行N个数,代表所经过的数字。
样例:
输入:
4
7
3 8
8 1 0
2 7 4 4
输出:
25
7 3 8 7
递推式:
f[i][j]=max(f[i+1][j],f[i+1][j+1])+c[i][j];
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 5 using namespace std; 6 7 int c[105][105],f[105][105]; 8 9 int n; 10 11 void find(int a,int b) 12 { 13 if(a>n) 14 return ; 15 printf("%d ",c[a][b]); 16 if(f[a+1][b]>f[a+1][b+1]) 17 find(a+1,b); 18 else 19 find(a+1,b+1); 20 return ; 21 } 22 23 int main() 24 { 25 scanf("%d",&n); 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=i;j++) 28 scanf("%d",&c[i][j]); 29 for(int i=1;i<=n;i++) 30 f[n][i]=c[n][i]; 31 for(int i=n-1;i>0;i--) 32 for(int j=1;j<=i;j++) 33 f[i][j]=(max(f[i+1][j],f[i+1][j+1])+c[i][j]); 34 printf("%d\n",f[1][1]); 35 find(1,1); 36 37 38 return 0; 39 }
时间: 2024-10-07 06:16:57