首页 > 代码库 > 4979 数塔 (动规)

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 }

 

4979 数塔 (动规)