Algorithm 动态规划算法:网格行走

Algorithm 动态规划算法:网格行走,algorithm,dynamic-programming,Algorithm,Dynamic Programming,在即将到来的考试中,我得到了一些练习题。我已经得到了这个问题的解决方案,在这张图片中有描述 对于这个解决方案真的没有任何解释 我很好奇我怎么能在这里找到答案。我想我可以创建一系列子问题,比如 从A->C,A->D,A->E遍历,然后根据前面的解算出A->B。但是我完全迷路了。首先,只有R=right和U=up步数,从(0,0)到(x,y)有多少种方法?(不限制不通过其他点。)每个路径的长度为x+y,并包含x R和y U,因此有binom(x+y,x)或binom(x+y,y)方法来实现 使用此

在即将到来的考试中,我得到了一些练习题。我已经得到了这个问题的解决方案,在这张图片中有描述

对于这个解决方案真的没有任何解释

我很好奇我怎么能在这里找到答案。我想我可以创建一系列子问题,比如


从A->C,A->D,A->E遍历,然后根据前面的解算出A->B。但是我完全迷路了。

首先,只有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。。。etc(所有成对的组合)。请注意,没有从C到D的路径(因为您不能向下),也没有从D到C的路径,因为您不能向左走


现在,使用包含排除。这样做的目的是减少不良案例。例如,一个坏的情况是从a开始,经过C,然后到B。有多少种方法可以做到这一点?nAC x国家编目局。另一个坏案例是通过E,有很多方法可以做到这一点。。。减去它们。那么通过D也是不好的。有nAD x nDB的方式结束在B通过E。。。把这些也减去。现在,问题是你减去了太多(通过两个坏点的路径)。。。所以把这些加进去。有多少点经过C和E,最后到达B?nAC x nCE x nEB,把它们加进去。通过D和E有多少点?nAD x nDE x nEB,把这些加进去。原则上,你可以减去通过这三条路径的路径,但是没有一条路径。

这个问题可以用手工解决,方法非常类似于你计算中的数字。在这个三角形中,每个数都是它上面两个数的和。类似地,在您的例子中,到达某一点的方法数(使用最短路径)只是到达其左侧点和其下方点的方法数之和。使用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

是否必须是最短路径(即始终长度为8),或者是否允许绕道?这可以完全使用计数技术和包含排除原则来完成,无需编码。如果这能回答你的问题,我很乐意发布详细信息。不必是最短的路径。它想知道有多少条不同的路径可以到达B,而不是有多少条不同的最短路径。好吧,我手工计算,正好有14条最短路径,所以如果你也可以计算长度超过8的路径,应该会有更多…有趣的是,我猜一定是最短路径。作为一个具体的例子,nAB=binom(4+4,4)=70;因为你向上移动4,向右移动4,所以x和y=4。nAC=binom(3+1,1)=4;因为你向上移动3,向右移动1,x=1,y=3。你或多或少用组合逻辑做了一个完整的计算。这当然是一种计算答案的有效方法,但我不确定它是否算作动态规划,因为这都是关于解决子问题的。然而,有趣的是,计算二项式系数的一种方法是使用Pascal三角形:)。我认为,如果与网格大小相比,必须避免的点数相对较少,那么这种方法将胜过动态规划解决方案。在这种情况下,这可能是一个掷硬币。这里的瓶颈是计算每对点的nXY(开始、结束、避免)。。。如果有很多,这一步会很耗时。事实上,我担心你的技术在20x20网格上没有很好的扩展,比如说有10个禁止点。我的技术的运行时间与网格中的点数成简单的线性关系。由于计数方法给出的“特殊”点的数量是二次的,因此只有当特殊点的数量不超过sqrt(网格大小)时,计数方法才会“更好”。