10303 数字三角(优先做)

时间限制:1000MS  内存限制:65535K
提交次数:117 通过次数:56

题型: 编程题   语言: G++;GCC;VC

 

Description

问题描述:给定一个由n行数字组成的数字三角形,如下图所示。试用动态规划算法,计算出从三角
顶部至底部的一条路径,使得该路径经过的数字总和最大。

注意每个数字只能走向下一行左边或右边的数字,而不能跳跃的走。

         7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5




输入格式

第一行是数字三角的行数n,1<=n<=100。接下来n行是数字三角各行中的数字,所有数字在0~99之间。



输出格式

输出两行,第一行是计算出的最大路径的和值,第二行是该路径上的数字。若有多条路径,靠右的路径
优先(即仅仅输出靠右的路径即可,无需多条路径都输出)。


如:
Input: 
5
7
3 8
8 1 6
2 7 4 4
4 5 2 4 5
有两条路径:7-3-8-7-5和7-8-6-4-5都为30,由于后者靠右,因此仅输出后者。
Output: 
30
7 8 6 4 5



 

输入样例

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5



 

输出样例

30
7 3 8 7 5



我的代码实现

 1 #include<stdio.h>
 2 #define N 101
 3 int a[N][N],m[N][N];
 4 
 5 
 6 int max(int a,int b){
 7     return a>b?a:b;
 8 }
 9 
10 
11 void MaxRoad(int n){
12     for(int j=1;j<=n;j++) 
13     m[n][j]=a[n][j];
14     for(int i=n-1;i>=1;i--){
15         for(int j=1;j<=i;j++){
16             m[i][j]=max(m[i+1][j],m[i+1][j+1])+a[i][j];
17         }
18     }
19 }
20 
21 void Back(int n){
22     int j=1;//j不变表示向下走,j+1表示往右走 
23     printf("%d ",a[1][1]); 
24     for(int i=2;i<=n;i++){
25         if(m[i][j]<=m[i][j+1]){
26             printf("%d ",a[i][j+1]);
27             j=j+1;    
28         }
29         else{
30         printf("%d ",a[i][j]);
31         }
32     } 
33 }
34     
35 
36 int main(){    
37     int n;
38     scanf("%d",&n);
39     for(int i=1;i<=n;i++){
40         for(int j=1;j<=i;j++){
41             scanf("%d",&a[i][j]);
42         }
43     }
44     MaxRoad(n);
45     printf("%d\n",m[1][1]);
46     Back(n);
47     return 0;
48 } 

 

 
posted on 2017-11-18 15:57  TinyRick  阅读(725)  评论(0编辑  收藏  举报