用动态规划编写递归算法

时间:2012-01-21 17:05:44

标签: recursion dynamic-programming catalan

我想使用动态编程技术编写算法,该技术执行以下操作: 找到沿着网格边缘的单调路径的数量,其具有n×n个方格单元,其不在对角线上方通过。单调路径是从左下角开始,在右上角完成,完全由向右或向上指向的边缘组成。

我有一些想法,但无法弄清楚如何正确行事。

3 个答案:

答案 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..nj范围为0..n,但始终为i<=j