题目:点击打开链接
线性DP 用二维数组存三角形 状态为行号和列号 初始值为底边数字
用二维maxSum数组存储每一个MaxSum(r,j)
状态转移方程:MaxSum[i][j]= D[i][j] i=N = max(MaxSum[i+1][j],MaxSum[i+1][j+1])+D[i][j] 其他
状态转移方程:MaxSum[i][j]= D[i][j] i=N = max(MaxSum[i+1][j],MaxSum[i+1][j+1])+D[i][j] 其他
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 101
int D[maxn][maxn];
int maxsum[maxn][maxn];
int n;
int main()
{
int i,j;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
scanf("%d",&D[i][j]);
}
for(int i=1;i<=n;++i)
maxsum[n][i]=D[n][i];//一开始把数组最后一行赋值
//两重循环,从下到上的递推
for(int i=n-1;i>=1;--i)
for(int j=1;j<=i;++j)
maxsum[i][j]=max(maxsum[i+1][j],maxsum[i+1][j+1])+D[i][j];//状态转移方程
printf("%d\n",maxsum[1][1]);
}
return 0;
}