【发布时间】:2013-03-24 06:32:06
【问题描述】:
给定一个由所有positive 整数组成的矩阵,从最左边的列0th 开始,找到最右边的列(n - 1)th 的最小路径。例如:
最小路径是包含 1 的路径。
在任何给定的方格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 个方向上移动,这使得不可能根据之前的预计算值来构建表格。
我在这里错过了什么吗?我看不出这种重复是如何进行的。任何的想法?
【问题讨论】:
-
我想你的教授忘了提到 1)S 不需要计算(即无限)超过矩阵的边缘,以及 2)S[0,0,0]=0。
-
...P.S.我知道这不是您要问的,但这确实需要迭代(非递归)BFS。
-
如果你有
S[i,j,0] = infinity,除了S[0,0,0] = 0,那么它应该可以工作。最终所有 S[i,j,k]==S[i,j,k+1] 并且您可以停止迭代。 S[i,j,k] 然后具有从 (0,0) 到 (i,j) 的最短路径的成本。 -
@VaughnCato:你能详细说明一下吗?提前致谢。
标签: algorithm dynamic-programming shortest-path