所谓二维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
个步数可用时的最大得分的较大值。
问题链接为: