给定所有positive
整数的矩阵,从最左侧的列0th
开始,找到最右侧列(n - 1)th
的最小路径。例如:
最小路径是包含在1& s上的路径。
在任何给定的方格m[i, j]
,我们可以移动到4个方向(left, right, up, down
);当然除了最左边,最右边的行/列的所有角落情况。例如,在[0, 0]
,我们只能移动right
或down
我的解决方案是构建m x n
个顶点的图形,然后运行 Floyd-Warshall 来计算任意两个顶点(u, v)
的所有对最短路径。然后运行另一个嵌套的for
循环,检查0th
列的所有顶点以及(n - 1)th
列的所有顶点,以找到最小路径。
但是,我的教授通过使用以下重复建议了另一种算法:
S[i, j, L] =
min(
S[i - 1, j, L - 1] + cost[i - 1, j],
S[i + 1, j, L - 1] + cost[i + 1, j],
S[i, j - 1, L - 1] + cost[i, j - 1],
S[i, j + 1, L - 1] + cost[i, j + 1]);
我不知道它是如何工作的!因为在任何给定的方格[i, j]
,我们可以在4个方向上移动,这使得无法根据先前预先计算的值构建表格。
我在这里错过了什么吗?我无法看到这种复发是如何产生的。任何的想法?
答案 0 :(得分:4)
如果你有S [i,j,0] =无穷大,除了S [0,j,L] = 0,那么它应该有效。最终所有S [i,j,L] == S [i,j,L + 1],你可以停止迭代。然后S [i,j,L]具有从第一列到该单元的最短路径的成本。
这是左上角的重复出现增加L值的方法。
0 inf inf inf inf
0 inf inf inf inf
0 inf inf inf inf
0 1 inf inf inf inf
0 20 inf inf inf inf
0 21 inf inf inf inf
0 1 2 inf inf inf
0 2 30 inf inf inf
0 21 22 inf inf inf
0 1 2 3 inf inf
0 2 3 39 inf inf
0 12 22 23 inf inf
0 1 2 3 4 inf
0 2 3 4 47 inf
0 12 12 23 24 inf
0 1 2 3 4 5
0 2 3 4 5 48
0 12 12 12 24 25
0 1 2 3 4 5
0 2 3 4 5 6
0 12 12 12 6 25
0 1 2 3 4 5
0 2 3 4 5 6
0 12 12 7 6 7
0 1 2 3 4 5
0 2 3 4 5 6
0 12 8 7 6 7
0 1 2 3 4 5
0 2 3 4 5 6
0 9 8 7 6 7
左上角不会发生进一步的变化。您可以看到它正在慢慢发现到达每个单元的最低成本。