通过具有正负成本的成本矩阵的最小成本路径

时间:2014-01-16 11:54:00

标签: algorithm language-agnostic dynamic-programming

这是我难以理解的最低成本路径动态规划问题的变体。

我给了一个成本矩阵mxn。成本矩阵具有正缓冲和随机放置的负成本。我从[1,1]开始,必须去[m,n]。我从一个初始缓冲区x开始。在我的遍历过程中,我的缓冲区x永远不应该是< = 0.如果它变为< = 0即使最终状态是一个正缓冲区也是一个无效路径(想象它就像一个以初始健康状态开始的玩家,负面成本扣除健康,积极的缓冲增加健康)。什么是我可以开始的最小初始缓冲区,使其达到[m,n]而中间没有任何0缓冲区(例如,最小初始运行状况,以便玩家可以完成路径而不会死亡)

1 个答案:

答案 0 :(得分:1)

假设H[i, j]是玩家从平方(i, j)开始时所需的最低健康状况。我们对H[1, 1]感兴趣,这是起始广场所需的最低健康状况。

我假设成本矩阵M中的所有值都是整数。因此,最小的积极健康状况是1。

在踩到最后一个方格之前所需的健康状况很容易:如果该方格中的值为正,我们需要1,否则我们至少需要比减去的更多:

H[m, n] = max(1 - M[m, n], 1)

其他简单的是矩阵的边缘:M[m, i]M[j, n]用于任意ij。如果当前值为负,我们必须增加所需的健康缓冲区,否则我们可以减少它(但绝不会超过1):

H[m, i] = max(H[m, i+1] - M[m, i], 1)
H[j, n] = max(H[j+1, n] - M[j, n], 1)

在矩阵的中心,我们有两个选择(向右和向下),所以我们采取最少的选择:

H[i, j] = min(max(H[i, j+1] - M[i, j], 1),
              max(H[i+1, j] - M[i, j], 1))

就是这样!将此转换为代码非常简单(假设Mmn已给出且M从1开始):

int[] H = new int[m, n];

H[m, n] = max(1 - M[m, n], 1);

// remember to loop backwards
for (int i = m-1; i >= 1; i--)
    H[m, i] = max(H[m, i+1] - M[m, i], 1);
for (int j = n-1; j >= 1; j--)
    H[j, n] = max(H[j+1, n] - M[j, n], 1);

// again, loop backwards
for (int i = m-1; i >= 1; i--)
    for (int j = n-1; j >= 1; j--)
        H[i, j] = min(max(H[i, j+1] - M[i, j], 1),
                      max(H[i+1, j] - M[i, j], 1));

return H[1, 1];