动态编程:通过网格找到障碍物的最短路径

时间:2017-01-04 07:22:34

标签: algorithm graph dynamic-programming

我试图通过Skiena的算法设计手册解决以下问题:

8-16考虑一个城市,其街道由X x Y网格定义。我们感兴趣的是从网格的左上角走到右下角。不幸的是,这个城市有不好的社区,我们不想走路的交叉点。我们给了一个X x Y矩阵BAD,其中BAD [i,j] ="是"当且仅当街道i和j之间的交叉点在附近时才能避免
(c)给出O(XY)算法以找到跨越网格的最短路径,以避免坏邻域。您可以假设所有块的长度相等。对于部分信用,给定O(X ^ 2 * Y ^ 2)算法。

问题来自关于动态规划的章节以及标题"图形问题"。我知道我可以将其建模为一个无向的未加权图形,其顶点适用于所有"好的"任何相邻的" good"之间的交叉点和边缘。顶点。鉴于这是一个未加权的图形,我可以从左上角顶点开始进行广度优先搜索,一旦到达右下角顶点,我就有最短路径。

鉴于此问题来自动态编程章节,我试图弄清楚如何使用动态编程来解决这个问题。到交叉点(i,j)的最短路径是1 +到交叉点的最短路径的最小值(i,j-1),(i-1,j),(i,j + 1),(i + 1) ,j)。这个公式似乎不适合动态编程的重叠子问题。可以使用动态编程解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

实际上,这种表述完全符合动态规划的重叠子问题。

在第一顺序中,到交叉点的最短路径可以根据到相邻交叉点的最短路径来表达。因此,子问题。

在第二顺序中,多个交叉点可以共享相同的相邻交叉点,其最短路径是每个其他交叉点中的输入。最短路径功能。因此,重叠的子问题。

另一方面,Dijkstra算法和Bellman-Ford算法都是动态编程算法的例子,可以解决给定的大O复杂约束中的示例问题。