题目链接
https://www.acwing.com/problem/content/900/
思路
闫氏dp法:
所以状态转移方程就是f [ i ] [ j ] = max(f [ i - 1 ][ j - 1 ] , f [ i - 1 ][ j ]) + a [ i ] [ j ] 。
需要注意的是在初始化dp数组的时候要多处理一列,因为处于边界的值会访问边界外的值。
c++代码
#include<bits/stdc++.h>
using namespace std;
const int N=510;
const int INF=-1e7;
int a[N][N],n,f[N][N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<=n;i++)
{
for(int j=0;j<=i+1;j++)
{
f[i][j]=INF;
}
}
f[1][1]=a[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])+a[i][j];
}
}
int MAX=INF;
for(int i=1;i<=n;i++)
{
MAX=max(MAX,f[n][i]);
}
printf("%d\n",MAX);
return 0;
}