注意一下f[i-1][1]为负值的情况下f[i][1]一定会贪心的计算成f[i-1][0]+a[i][1],但是f[i-1][0]是没有意义的,所以这种情况是错误的,最终可能会导致答案变大,所以我们在处理边界问题是要注意一下,f[i][i]情况同理
#include<iostream>
using namespace std;
const int N=510;
int f[N][N];
int a[N][N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)cin>>a[i][j];
}
//f[i][j]表示从a[1][1]一直走到a[i][j]的最大路径
//状态转移方程为if(j==1)f[i][j]=f[i-1][1]+a[i][j];
//else if(j<i&&j>1)f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);
//else f[i][j]=f[i-1][j-1]+a[i][j];
//当所有的f[i][1]都为负值时,我们这种状态转移是有风险的,因为f[i][j]必定会被计算成f[i-1][0]+a[i][j]
//这样的话就失去了状态转移的意义了
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(j==1)f[i][j]=f[i-1][1]+a[i][j];
else if(j<i&&j>1)f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);
else f[i][j]=f[i-1][j-1]+a[i][j];
}
}
int maxx=-1e9;
for(int j=1;j<=n;j++)
{
maxx=max(f[n][j],maxx);
}
cout<<maxx;
return 0;
}