
代码:
#include<cstdio>
#include<iostream>
using namespace std;
int a[105][105],b[105][105];//a数组保存原数据,b数组保存以这一节点以下(包括此节点)各节点相加最大的值
int main()
{
int i,j;
int n;
int k;
scanf("%d",&n);
k=0;
for(i=0; i<n; i++)
for(j=0; j<i+1; j++)
scanf("%d",&a[i][j]);//输入数据
for(i=0; i<n; i++)
b[n-1][i]=a[n-1][i];//复制a最后的各叶子节点的值给b最后的各叶子节点(因为这些节点没有子节点,本身就是最大值)
for(i=n-1; i>0; i--)
{
for(j=0; j<i; j++)
{
if(b[i][j]>b[i][j+1])
{
b[i-1][j]=a[i-1][j]+b[i][j];//状态转移方程:b[i][j]=max(b[i+1][j],b[i+1][j+1])+a[i][j]
}
else
{
b[i-1][j]=a[i-1][j]+b[i][j+1];
}
//可替换为b[i-1][j]=max(b[i][j],b[i][j+1])+a[i-1][j];
}
}
printf("%d\n",b[0][0]);//路径经过的最大数字和
printf("%d",a[0][0]);
i=1;
j=0;
while(i<n)//从上到下找到那条最大数字和的路径并输出
{
if(b[i][j]>b[i][j+1])
{
putchar(' ');
printf("%d",a[i][j]);
i++;
j=j;
}
else
{
putchar(' ');
printf("%d",a[i][j+1]);
i++;
j++;
}
}
return 0;
}```