【问题描述】 给定一个数塔,如下图所示。在此数塔中,从顶部出发,在每一节点可以选择走左下或右下,一直走到底层。请找出一条路径,使路径上的数值和最大。
【输入形式】 输入时第一行一个整数n,表示该数塔的行数,其余n行表示该塔每行的数值 【输出形式】 输出包含两行,第一行为最大路径上的数值之和, 第二行n个数字为从上而下最大路径数值 【样例输入】 5912 1510 6 82 18 9 519 7 10 4 16 【样例输出】 599 12 10 18 10 |
【My code】:
#include<iostream>
using namespace std;
int main()
{
int n,i,j;
cin>>n;
int a[100][100]={0};
int b[100][100]={0};
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
cin>>a[i][j];
b[i][j]=a[i][j];
using namespace std;
int main()
{
int n,i,j;
cin>>n;
int a[100][100]={0};
int b[100][100]={0};
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
for(i=n-1;i>0;i--){
for(j=0;j<=i-1;j++){
if(b[i][j]>b[i][j+1]){
b[i-1][j]=b[i][j]+b[i-1][j];
}
else{
b[i-1][j]=b[i][j+1]+b[i-1][j];
}
}
}
cout<<b[0][0]<<endl;
cout<<a[0][0]<<' ';
j=0;
for(i=1;i<n;i++){
if(b[i][j]>b[i][j+1]){
cout<<a[i][j]<<' ';
}
else{
cout<<a[i][j+1]<<' ';
j++;
}
}
}
for(i=n-1;i>0;i--){
for(j=0;j<=i-1;j++){
if(b[i][j]>b[i][j+1]){
b[i-1][j]=b[i][j]+b[i-1][j];
}
else{
b[i-1][j]=b[i][j+1]+b[i-1][j];
}
}
}
cout<<b[0][0]<<endl;
cout<<a[0][0]<<' ';
j=0;
for(i=1;i<n;i++){
if(b[i][j]>b[i][j+1]){
cout<<a[i][j]<<' ';
}
else{
cout<<a[i][j+1]<<' ';
j++;
}
}
cout<<endl;
return 0;
}
return 0;
}