我想使用动态编程技术编写算法,该技术执行以下操作: 找到沿着网格边缘的单调路径的数量,其具有n×n个方格单元,其不在对角线上方通过。单调路径是从左下角开始,在右上角完成,完全由向右或向上指向的边缘组成。
我有一些想法,但无法弄清楚如何正确行事。
答案 0 :(得分:2)
首先,通过求解退化情况(0 x 0
网格)找到递归的基础。然后通过想象问题的一部分(例如K x M
已经解决)来查找重复步骤,看看是否可以通过向其添加一行或一列来扩展该解决方案,从而制定解决方案{{1 }或K+1 x M
。这应该很简单:对于您添加的每个点,查看网格点是否在对角线下方,然后将从底部和左侧通向该点的路径数相加。其中一个点位于K x M+1
,另一个位于您正在构建的附加行或列中。
通过退化案例和手头递归步骤,首先解决K x M
问题,然后0 x N
,然后1 x N
,依此类推,直到获得{ {1}}解决方案。
答案 1 :(得分:1)
这是一个可能只考虑方格网格的递归。
n×n 网格上有两种单调路径不跨越对角线:在某个中间点接触对角线的那些(i,i) 0<我< n ,以及那些没有。
首先触及(i,i)对角线的 n×n 网格上的路径可以分成两部分:<一条路径< em> i×i 网格不接触对角线,另一个网格接触(ni)×(ni)网格并且接触对角线。这表明你可以计算那些考虑了所有可能的递归的那些。
不接触对角线的路径将以“向右”开始,以“向上”结束。在这两个移动之间是(n-1)×(n-1)网格上的单调路径,该网格不会穿过对角线但可能会碰到它。
我们在这里计算的是 n th Catalan number。如果你想验证你的递归计算,有一个公式。
答案 2 :(得分:0)
让到达坐标(i,j)
的路径数为P(i,j)
。因此(假设左下角为(0,0)
):
P(i,j) = P(i-1,j) + P(i,j-1)
您可以进一步设置坐标不低于对角线的条件。也就是说:i
的范围为0..n
,j
范围为0..n
,但始终为i<=j
。