一道线性DP题目进阶-论二维DP

所谓二维DP,即为dp数组的维度为二维的dp(当然有时候可能会三维四维,或者存在一些优化使得它降维),广义的来讲就是有多个维度的dp,即用于描述dp的状态不止一个。

在之前,我们做过一道线性DP的题目,即为数字三角形,现在在这道题目的基础之上添加路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1,这使得dp数组从二维升到了三维,考虑的因素更多了。

问题思路:定义了一个三维数组 dp[N][N][N],其中 N=150。它表示从第 i 行第 j 列开始,还剩下 k 个可用步数(即还能向下移动的次数)时,可以获得的最大得分,二维数组a[N][N]还是不变,为输入直角三角形的具体数字。

接下来,使用嵌套循环进行动态规划计算。从最后一行开始(即第 n 行),计算每个位置的最大得分。对于第 i 行第 j 列的位置,有以下两种情况(嵌套三层循环,第三层的参数为k,并且k从0开始,终于n - i显然),对于k:

  • 如果 k >= 1,表示还有剩余的步数可以向下移动。那么,可以选择向下移动一步,得分为当前位置的数字加上下一行的两个相邻位置中较大的得分。
  • dp[i][j][k] = a[i][j] + max(dp[i+1][j][k], dp[i+1][j+1][k-1]);
  • 如果 k = 0,表示已经没有剩余的步数可以向下移动。那么,只能继续向下移动一步,得分为当前位置的数字加上下一行的相同位置的得分。
  • dp[i][j][k] = a[i][j] + dp[i+1][j][k];

而且,最后的答案是根据三角形行数n的奇偶性决定的:

如果 n 是奇数,输出 dp[1][1][(n - 1)/2],表示从第一行第一列开始,还有 n - 1 个步数可用时的最大得分。
如果 n 是偶数,输出 max(dp[1][1][(n-1)/2], dp[1][1][n-1 - (n -1)/2]),表示从第一行第一列开始,还有 (n - 1)/2 个步数可用时的最大得分以及从第一行第一列开始,还有 n - 1 - (n - 1)/2 个步数可用时的最大得分的较大值。

问题链接为:

https://www.lanqiao.cn/problems/505/learning/?page=1&first_category_id=1&name=%E6%95%B0%E5%AD%97%E4%B8%89%E8%A7%92%E5%BD%A2

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值