1000: 数塔

1000: 数塔

时间限制: 1 Sec  内存限制: 128 MB
提交: 683  解决: 297
[提交][状态][讨论版]

题目描述

 

给定一个数塔,如下图所示。在此数塔中,从顶部出发,在每一节点可以选择走左下或右下,一直走到底层。请找出一条路径,使路径上的数值和最大。

       

9

       
     

12

 

15

     
   

10

 

6

 

8

   
 

2

 

18

 

9

 

5

 

19

 

7

 

10

 

4

 

16

输入

 

输入时第一行一个整数n,表示该数塔的行数,其余n行表示该塔每行的数值

输出

 

输出包含两行,第一行为最大路径上的数值之和, 第二行n个数字为从上而下最大路径数值

样例输入

5
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16

样例输出

59
9 12 10 18 10

提示

 

来源

#include <iostream>
using namespace std;
int main(){
 int n,i,j;
 int a[100][100],b[100][100],c[100][100];
 cin>>n;
 for(i=0;i<n;i++){
  for(j=0;j<=i;j++){
   cin>>a[i][j];
  }
 }
 for(i=0;i<n;i++){
  b[n-1][i]=a[n-1][i]; //最后一行距离最后一行的最大值为其本身值
 }
 for(i=n-2;i>=0;i--){//从倒数第二行走起,从下往上走
  for(j=0;j<=i;j++){
    if((a[i][j]+b[i+1][j])>(a[i][j]+b[i+1][j+1])){ 
     c[i][j]=0;//表示往左走
     b[i][j]=a[i][j]+b[i+1][j]; //记录往左走,从最后一行的某个元素到a[i][j]这个元素的最大和
    }else{
     c[i][j]=1;
     b[i][j]=a[i][j]+b[i+1][j+1];
    }
  }
 }
 cout<<b[0][0]<<endl;
 cout<<a[0][0];
 j=0;
 for(i=0;i<n-1;i++){ //利用j为0往左为1往右来打印路径
  j=j+c[i][j];
  cout<<" "<<a[i+1][j];
 }
 cout<<endl;
 return 0;
}

posted @ 2016-08-17 19:16  知我者,足以  阅读(788)  评论(2编辑  收藏  举报