zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    话说 SVN 与 Git 之间的区别
    CentOS 7 之安装 Oracle 11gR2
    @meda媒体查询
    为样式找到应用目标-CSS选择器
    JQuery和原生JavaScript实现网页定位导航特效
    CSS代码缩写
    认识CSS样式
    文档类型、DOCTYPE切换和浏览器模式
    MIME 参考手册
    微格式(microformat)
  • 原文地址:https://www.cnblogs.com/lchzls/p/5781420.html
Copyright © 2011-2022 走看看