4979 数塔
时间限制: 1 s
空间限制: 1000 KB
题目等级 : 黄金 Gold
题目描述 Description
有如图数塔,从顶部出发,在每一节点选择向左走或向右走,一直走到底。要求找到一个路径,使路径总和最大。
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
输入描述 Input Description
第一行输入一正整数n
接下来从第2行到第n+1行每行输入行数减1个正整数m。
输出描述 Output Description
共两行
第一行输出最大总和;
第二行输出最大路径,用‘-’隔开;
样例输入 Sample Input
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
样例输出 Sample Output
86
13-8-26-15-24
数据范围及提示 Data Size & Hint
40%数据:n<=20 , m<=1000
60%数据:n<=60 , m<=1050
1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 int n; 5 int num[66][66]; 6 int f[66][66]; 7 int pre[66][66]; 8 int main() 9 { 10 cin>>n; 11 for(int i=1;i<=n;++i) 12 { 13 for(int j=1;j<=i;++j) 14 { 15 scanf("%d",&num[i][j]); 16 if(i==n)f[i][j]=num[i][j]; 17 } 18 } 19 for(int i=(n-1);i>=1;--i) 20 { 21 for(int j=1;j<=(i+1);++j) 22 { 23 if(f[i+1][j]>f[i+1][j+1]) 24 { 25 pre[i][j]=j; 26 f[i][j]=f[i+1][j]+num[i][j]; 27 } 28 else 29 { 30 pre[i][j]=j+1; 31 f[i][j]=f[i+1][j+1]+num[i][j]; 32 } 33 } 34 } 35 cout<<f[1][1]<<endl<<num[1][1]; 36 int k=1,h=1; 37 while(pre[k][h]) 38 { 39 h=pre[k][h]; 40 ++k; 41 cout<<"-"<<num[k][h]; 42 } 43 return 0; 44 }