#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
//ap表示原三角,bp表示各子问题最优解,cp表示子问题是如何合成原问题的
int ap[105][105],bp[105][105],cp[105][105],n;
void Init()
{
memset(ap,0,sizeof(ap));
memset(bp,0,sizeof(bp));
memset(cp,0,sizeof(cp));
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>ap[i][j];
}
}
}
void Solve()
{
//边界条件
for(int j=1;j<=n;j++)bp[n][j]=ap[n][j];
//其余条件
for(int i=n-1;i>=1;i--){
for(int j=1;j<=i;j++){
if(bp[i+1][j]>bp[i+1][j+1]){
cp[i][j]=0;
bp[i][j]=ap[i][j]+bp[i+1][j];
}
else{
cp[i][j]=1;
bp[i][j]=ap[i][j]+bp[i+1][j+1];
}
}
}
}
void Print()
{
cout<<bp[1][1]<<endl;
for(int i=1,j=1;i<=n;i++){
cout<<ap[i][j]<<" ";
j+=cp[i][j];
}
}
int main()
{
//初始化
Init();
//解决问题
Solve();
//输出答案
Print();
return 0;
}
scau10303
最新推荐文章于 2024-06-10 15:45:07 发布