使用动态编程遍历矩阵

时间:2017-10-27 22:43:15

标签: algorithm matrix dynamic-programming

假设有一个包含N行和M列的矩阵。

您在左下角开始遍历,当前点P为0,空格S大于0.在矩阵中的每个点,坐标为空或者包含点。如果点的大小为X且值为V,则可以选择是否在到达坐标时拾取点。

对于遍历矩阵,我们只能向上一行并从三列中的一列中选择(即(i + 1, j − 1)(i + 1, j)(i + 1, j + 1)

提取积分会使P增加VS增加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))

那会有用吗?我将如何将其引入算法?

1 个答案:

答案 0 :(得分:0)

您可以通过两种方式实现:

  1. 递归调用函数,该函数应涵盖所有边界/边缘条件 例如,函数调用如下所示:

    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)}
    
  2. 使用(s <0)条件进行跟踪迭代,您可以为每个步骤维护最大S和P值的矩阵。