动态编程算法:在网格上行走

时间:2014-12-16 20:44:43

标签: algorithm dynamic-programming

我为即将到来的考试提供了一些练习题。我已经给出了这个问题的解决方案,这里描述了这个问题 enter image description here

解决方案确实没有解释。

我很好奇我怎么能在这里得到答案。我想我可以创建一堆像

这样的子问题

从A-> C,A-> D,A-> E遍历,然后基于先前的解决方案找出A-> B.但我很失落。

2 个答案:

答案 0 :(得分:5)

首先,只使用R = right和U = up步骤从(0,0)到(x,y)的方式有多少? (不限制不通过其他点。)每个这样的路径都有x + y长度并且包含x R和y U,所以有binom(x + y,x)或binom(x + y,y)的方式这样做。

使用此信息,您可以计算A-B(称为nAB),A-C(称之为nAC),A-D,......等(所有组合对)的路径数。请注意,从C到D没有路径(因为你不能下去),没有从D到C的路径,因为你不能向左走。

现在,使用包含排除。这个想法是减去坏情况。例如,一个不好的案例将从A开始经过C然后再到B.这可以做多少种方法? nAC x nCB。另一个不好的情况是通过E,有nAE x nEB方法可以做到这一点......减去它们。然后经历D也很糟糕。有一些nAD x nDB方式最终在B处通过E ...减去那些。现在,问题是你已经减去了太多(经历了2个坏点的路径)......所以重新加入。有多少点通过C和E并结束于B? nAC x nCE x nEB,添加那些。经过D和E多少分? nAD x nDE x nEB,添加它们。原则上,你将减去通过这三个路径的路径,但没有这些路径。

答案 1 :(得分:3)

这个问题可以通过非常类似于Pascal's triangle中计算数字的方式解决。在该三角形中,每个数字都是它上面两个数字的总和。类似地,在您的情况下,到达某个点(使用最短路径)的方式的数量,只是到达其左侧点和下面点的方式的总和。使用ASCII艺术演示:

1 -> 1 -> 7 -> 7 ->14
^         ^         ^
|         |         |
1    C    6    E    7
^         ^         ^
|         |         |
1 -> 3 -> 6 -> 6 -> 7
^    ^    ^         ^
|    |    |         |
1 -> 2 -> 3    D    1
^    ^    ^         ^
|    |    |         |
A -> 1 -> 1 -> 1 -> 1

因此,要计算某个字段的路径数,首先需要知道其左侧和下方的两个子问题的答案。这是可以使用动态编程解决的问题的教科书示例。实现这一点的唯一棘手的方法是如何处理禁用点和边缘。在实践中如何做到这一点的一种方法是将所有边缘和禁止点初始化为零,并将A点指向1:

0 -> 
          ^         ^
          |         |
0 ->      0 ->      0 ->


0 -> 
                    ^
                    |
0 ->                0 ->
     ^
     |
     1 ->
          ^    ^    ^    ^
          |    |    |    |
          0    0    0    0  

从那里开始,您可以使用一个简单的总和来计算所有缺失的字段,从左下角的A点开始,然后一直向上到达右上角的B点:

0 -> 1 -> 1 -> 7 -> 7 ->14
     ^    ^    ^    ^    ^
     |    |    |    |    |
0 -> 1    0 -> 6    0 -> 7
     ^         ^         ^
     |         |         |
0 -> 1 -> 3 -> 6 -> 6 -> 7
     ^    ^    ^    ^    ^
     |    |    |    |    |
0 -> 1 -> 2 -> 3    0 -> 1
     ^    ^    ^         ^
     |    |    |         |
     1 -> 1 -> 1 -> 1 -> 1
          ^    ^    ^    ^
          |    |    |    |
          0    0    0    0