2013-03-24 47 views
1

鉴于所有positive整数矩阵,从最左列0th出发,找到最右列(n - 1)th最小路径。例如:
enter image description here如何用动态规划解决地形图最短路径?

最小路径是包含1的路径。

在任何给定方m[i, j],我们可以移动至4个方向(left, right, up, down);当然除了最左边,最右边的所有行/列的所有角落案例。例如,在[0, 0],我们只能移动rightdown
我的解决方案是建立一个m x n顶点图,然后运行Floyd-Warshall来计算任意两个顶点的所有最短路径(u, v)。然后运行另一个嵌套循环for检查与(n - 1)th列的所有顶点0th列的所有顶点找到最小路径。
然而,我的教授通过以下复发建议另一种算法:

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

我想你的教授忘了提及,1)s不需要被计算(即无穷大)过去的矩阵的边缘上,以及2)S [0,0,0] = 0。 – Beta 2013-03-24 06:39:18

+0

... P.S。我知道这不是你要问的,但是这真的要求迭代(非递归)的BFS。 – Beta 2013-03-24 06:43:45

+1

如果你有'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)的最短路径的代价。 – 2013-03-24 06:51:44

回答

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 

没有进一步的变化将发生在左上角。您可以看到它正在慢慢发现到达每个单元的最低成本。

+0

您是否知道一种方法来表征这些步骤的数量,直至收敛? – Dougal 2013-03-24 07:19:07

+0

谢谢,但它并不总是从'[0,0]'开始。我们是否应该为列'0th'的所有行运行并比较它们? – Chan 2013-03-24 07:44:33

+0

@Chan:我没有仔细阅读你的问题。我已经更新了我的答案。没有必要多次运行该算法,只需要一个不同的开始状态。 – 2013-03-24 14:23:57