假设有一个包含N
行和M
列的矩阵。
您在左下角开始遍历,当前点P
为0,空格S
大于0.在矩阵中的每个点,坐标为空或者包含点。如果点的大小为X
且值为V
,则可以选择是否在到达坐标时拾取点。
对于遍历矩阵,我们只能向上一行并从三列中的一列中选择(即(i + 1, j − 1)
,(i + 1, j)
或(i + 1, j + 1)
)
提取积分会使P
增加V
,S
增加X
。
我试图编写一个动态编程算法来遍历这个并返回最佳路径,从而产生最大数量的点。
我认为子问题是:
L(N, j) = Null
L(i, 0) = max(L(i + 1, 0), L(i + 1, 1))
L(i, j) = max(L(i + 1, j − 1), L(i + 1, j), L(i + 1, j + 1))
L(i, M) = max(L(i + 1, j - 1), L(i + 1, j))
那会有用吗?我将如何将其引入算法?
答案 0 :(得分:0)
您可以通过两种方式实现:
递归调用函数,该函数应涵盖所有边界/边缘条件 例如,函数调用如下所示:
function L(i,j, p, s) :
if(i<0 or j<0) return -1 #edge case
if(s<0) return -1 #out of space
if(p<0) return 0 #no possible outcome
if (s == 0) return p #the end
else return max{L(i + 1, j − 1, p+v, s-x), L(i + 1, j, p+v, s-x), L(i + 1, j + 1, p+v, s-x)}
使用(s <0)条件进行跟踪迭代,您可以为每个步骤维护最大S和P值的矩阵。