4979 数塔 (动规)

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 }

 

posted @ 2017-04-25 17:49  MJT12044  阅读(171)  评论(0编辑  收藏  举报