SCU - 1114 数字三角

下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。

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 } 

 

posted @ 2017-08-03 16:04  西北会法语  阅读(166)  评论(0编辑  收藏  举报