动态规划入门到入土——入门之数字三角形

先放题目
P1216
动态规划又称dp一般需要一下几步
1. 定义状态
2. 初始化
3. 状态转移方程
4. 查找答案
我们根据上面的步骤,解决这个问题。
1. 定义状态: dp_{i,j} 表示走到 (i,j) 得到的最大数字总和。
2. 初始化:很明显 dp_{1,1}=a_{1,1} ,其中 a_{i,j} 是$(i,j)$ 上的数字。
3. 状态转移方程:它可以向下方或右下方走,那么很明显 (i,j) 可以从 (i-1,j)(i-1,j-1) 走过来,状态转移方程就是 dp_{i,j}=max_{dp_{i-1,j-1}}^{dp_{i-1,j}}+a_{i,j}
4. 查找答案:最后走到最后一行所以答案就是 \displaystyle\sum_{i=1}^{n}max_{dp_{n,i}}
那么最终代码如下(这里我只放核心代码):

for(int i=2;i<=n;++i)
for(int j=1;j<=i;++j) dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
for(i=1;i<=n;++i) Max=max(Max,a[n][i]);
cout<<Max;
1 个赞

\color{yellow}讲得好

谢谢,以后会继续更新

你已经学会P1216了,快来学习插头DP,斜率优化吧

1 个赞

666

666