码迷,mamicode.com
首页 > 其他好文 > 详细

1000: 数塔

时间:2016-08-17 19:33:30      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:

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];
    }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=j+c[i][j];
  cout<<" "<<a[i+1][j];
 }
 cout<<endl;
 return 0;
}

1000: 数塔

标签:

原文地址:http://www.cnblogs.com/lchzls/p/5781420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!