正序dp 要考虑好边界 0 和 i+1 的位置也要初始化为负无穷
倒序dp 不用考虑边界问题,代码简单一些
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=505;
const int INF=1e9;
int n;
int w[N][N],f[N][N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)
cin>>w[i][j];
}
//初始化边界
for(int i=0;i<=n;i++){
for(int j=0;j<=i+1;j++)
f[i][j]=-INF;
}
//状态转移
f[1][1]=w[1][1];//初始化!!!
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
f[i][j]=max(f[i-1][j-1],f[i-1][j])+w[i][j];
int res=-INF;
for(int j=1;j<=n;j++)res=max(res,f[n][j]);
cout<<res<<"\n";
return 0;
}
使用原数组 就没有初始化 也不用考虑边界了