给定大小为N X N
的网格。它的左下角是(0,0)
,右上角的元素是(N-1,N-1)
。
我们可以向上或向右移动网格。我们必须找到从左下角到右上角的遍历方式。 我们必须在每条路径中访问一些检查点 。至少有一条有效路径。
示例:N=5
我们在(2,2)
有1个检查点,此处答案为36
。
注意:我只需要计算有效路径,并且无需担心找到它们。
什么可以有效地计算它们?
答案 0 :(得分:2)
你必须知道两件事:
Rule of product:这意味着从开始到结束的方式数量从开始到中间点的方式数相等*从中间点到结束的方式数。
C(R,R + U)(R
是您的右移动次数,U
是您想要的向上移动次数从(a,b)
转到(c,d)
然后R = c-a
和U = d-b
以及C(R,R+U) = (R+U)!/R!U!
)是从左下角到右上角有多少种方式的答案网格。
示例:
从(0,0)
到(2,2)
的移动次数,因为从0
向右移动2
后两次从0
移动到达2
后{1}}所以R=2
和U=2
所以C(2,2+2) = C(2,4) = 4!/2!2! = 6
。对于从R
到U
的{{1}}和(2,2)
次移动,同样做(4,4)
从第一条规则我们可以获得所有可能的动作:C(2,2+2) = C(2,4) = 4!/2!2! = 6
答案 1 :(得分:1)
使用动态编程:
dp[k, i, j] = number of paths from checkpoint k to (i, j)
dp[k, i, j] = dp[k, i - 1, j] + top
dp[k, i, j - 1] right
答案是检查点之间dp
值的乘积。
注意:您可以通过认识到矩阵中的实际位置无关紧要,只考虑位置与检查点位置之间的相对距离来避免第一维。
答案 2 :(得分:0)
这个特殊问题的关键是找到子点之间的路径数(在根据各自的位置排序之后),然后乘以所有路径数。
这里的解决方案是:
<强> 1。对从源到目的地的点进行排序。
实施例: 如果起点为[0,0],则终点为[10,10],中间点为[5,6],[2,4]&amp; [8,8],然后在11X11中排序的点(包括源和目的地)将是[0,0],[2,4],[5,6],[8,8],[10,10]基质
<强> 2。查找从源到下一个子目标的路径数(最好使用DP)。 (按分类顺序排列)
在上面的示例中,需要计算的路径数量将介于以下几点之间:
[0,0]至[2,4]
[2,4]至[5,6]
[5,6]至[8,8]
[8,8]至[10,10]
第3。找到以上所有4个子路径的产品
就是这样
这是一个solution,用于查找源和目标的路径数(请参阅DP方法)。您不需要将矩阵作为参数传递,因为这是不需要的。只需要[x,y] [X,Y]形式的源点和目标点。除了链接中存在的代码之外,其他部分(对点进行排序和乘法)必须如上所述完成。