代码之家  ›  专栏  ›  技术社区  ›  roxrook

如何用动态规划求解地形图的最短路径?

  •  1
  • roxrook  · 技术社区  · 11 年前

    给定所有矩阵 positive 整数,从最左边的列开始 0th ,找到最右侧列的最小路径 (n - 1)th 。例如:
    enter image description here

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

    在任何给定的广场 m[i, j] ,我们可以移动到4个方向( left, right, up, down ); 当然,除了最左边、最右边的行/列的所有角情况。例如,在 [0, 0] ,我们只能移动 right down .
    我的解决方案是建立一个 m x n 顶点,然后运行 弗洛伊德算法 计算任意两个顶点的所有对最短路径 (u, v) 。然后运行另一个嵌套 for 循环以检查 具有的所有顶点的列 第(n-1)个 列以查找最小路径。
    然而,我的教授通过使用以下递归提出了另一种算法:

    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 回复  |  直到 11 年前
        1
  •  4
  •   Vaughn Cato    11 年前

    如果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
    

    左上角不会发生进一步的更改。你可以看到,它正在慢慢发现到达每个细胞的最低成本。