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;
}
时间: 2024-09-30 15:37:39