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 }