4979 数塔

时间限制: 1 s

 空间限制: 32000 KB
 题目等级 : 黄金 Gold
 
 
题目描述 Description

有如图数塔,从顶部出发,在每一节点选择向左走或向右走,一直走到底。要求找到一个路径,使路径总和最大。

                               13

                          11       8

                     12       7      26

                  6      14      15      8

            12      7      13      24     11

输入描述 Input Description

第一行输入一正整数n

接下来从第2行到第n+1行每行输入行数减1个正整数m。

输出描述 Output Description

共两行

第一行输出最大总和;

第二行输出最大路径,用‘-’隔开;

样例输入 Sample Input

5

13

11   8

12   7  26

 6  14  15   8

12   7  13  24  11

样例输出 Sample Output

86

13-8-26-15-24

数据范围及提示 Data Size & Hint

40%数据:n<=20 , m<=1000

60%数据:n<=60 , m<=1050

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
bool d;
int b[101][101],c[101][101],n,tot;
int main(){
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        for(j=1;j<=i;j++){
            scanf("%d",&b[i][j]);
            c[i][j]=b[i][j];
        }
    }
    for(i=n-1;i>=1;i--)
        for(j=1;j<=i;j++)
            b[i][j]+=max(b[i+1][j],b[i+1][j+1]);
    printf("%d
%d-",b[1][1],c[1][1]);
    j=1;
    for(int i=2;i<=n;i++){
        if(b[i][j]>=b[i][j+1])
            printf("%d",c[i][j]);
        else{
            printf("%d",c[i][j+1]);
            j++;
        }
        if(i!=n)
            printf("-");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/suishiguang/p/5762391.html