提交: 1311 解决: 623
[提交][状态][讨论版]
题目描述
给定一个数塔,如下图所示。在此数塔中,从顶部出发,在每一节点可以选择走左下或右下,一直走到底层。请找出一条路径,使路径上的数值和最大。
9 | ||||||||
12 | 15 | |||||||
10 | 6 | 8 | ||||||
2 | 18 | 9 | 5 | |||||
19 | 7 | 10 | 4 | 16 |
输入
输入时第一行一个整数n,表示该数塔的行数,其余n行表示该塔每行的数值
输出
输出包含两行,第一行为最大路径上的数值之和,第二行n个数字为从上而下最大路径数值
样例输入
5
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
样例输出
59
9 12 10 18 10
#include<iostream> #include<cstring> #define MAXN 100 using namespace std; int return_max(int x,int y) { return x>y?x:y; } int main() { int n; int i,j; int a[MAXN][MAXN]; int b[MAXN][MAXN]; int c[MAXN]; int count = 1; int result; cin >>n; memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); for(i=1;i<=n;i++) { for(j=1;j<i+1;j++) { cin >>a[i][j]; b[i][j]=a[i][j]; } } for(i=n-1;i>=1;i--) { for(j=1;j<=i;j++) { a[i][j] = a[i][j]+return_max(a[i+1][j],a[i+1][j+1]); } } cout << a[1][1]<<endl; result = a[1][1] - b[1][1]; c[0] = b[1][1]; for(i=2;i<=n;i++) { for(j=1;j<i+1;j++) { if(result == a[i][j]) { c[count++] = b[i][j]; result = a[i][j] - b[i][j]; } } } cout <<c[0]; for(i=1;i<count;i++) { cout <<" "<<c[i]; } cout <<endl; return 0; }