我认为这些标准的措辞很糟糕,因为重叠和独立具有某种冲突的含义。
无论如何,为了能够有效地使用你需要的 DP 方法
- 可以根据更简单的问题递归定义的问题
- 部分解决方案的概念,其中剩余部分的解决方案不取决于您如何到达当前点
示例:如果您想计算从第一行开始在矩阵中移动并且每个步骤都在下一行并且在同一列或相邻列中移动时的最大和路径是什么,您可以将当前总和用作“状态” ,当前行和当前列,因为对于解决方案,用于到达当前位置的路径无关紧要。
1 4 [3] 2 1 4 9
2 1 [3] 1 2 3 1
9 [8] 3 0 1 2 9
0 [0] 2 4 1 6 3
1 2 [6] 3 0 4 1
在上面的模式中,这条路径的总和为 3+3+8+0+6。为了使总和最大化,您可以观察到从某个点经过的路径的最大值可以作为到达那里的最大值和从那里到矩阵末端的最大值。因此,解决方案可以拆分为独立的子问题,您可以缓存从矩阵的给定点到最后的最大总和的结果(独立于您如何到达该点)。
def maxsum(x, y):
if (x, y) in cache:
return cache[(x, y)]
if y == height - 1:
return matrix[y][x]
if x == 0:
left = -1
else:
left = matrix[y][x] + maxsum(x-1, y+1)
center = matrix[y][x] + maxsum(x, y+1)
if x == width-1:
right = -1
else:
right = matrix[y][x] + maxsum(x+1, y+1)
result = cache[(x, y)] = max(left, center, right)
return result
如果我添加到规则中允许不超过三个“9”但是你不能只使用坐标作为状态,因为后面的子问题(到最后)将受到前一个的影响(即有多少个“9” “你在到达中间位置时已经收集了)。
您仍然可以使用动态编程方法,但具有更大的状态空间,例如将收集到的“9”的数量添加到当前状态表示中。
def maxsum(x, y, number_of_nines):
if (x, y, number_of_nines) in cache:
return cache[(x, y, number_of_nines)]
...