这是我难以理解的最低成本路径动态规划问题的变体。
我给了一个成本矩阵mxn。成本矩阵具有正缓冲和随机放置的负成本。我从[1,1]开始,必须去[m,n]。我从一个初始缓冲区x开始。在我的遍历过程中,我的缓冲区x永远不应该是< = 0.如果它变为< = 0即使最终状态是一个正缓冲区也是一个无效路径(想象它就像一个以初始健康状态开始的玩家,负面成本扣除健康,积极的缓冲增加健康)。什么是我可以开始的最小初始缓冲区,使其达到[m,n]而中间没有任何0缓冲区(例如,最小初始运行状况,以便玩家可以完成路径而不会死亡)
答案 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]
用于任意i
和j
。如果当前值为负,我们必须增加所需的健康缓冲区,否则我们可以减少它(但绝不会超过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))
就是这样!将此转换为代码非常简单(假设M
,m
和n
已给出且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];