Recursion 用动态规划编写递归算法

Recursion 用动态规划编写递归算法,recursion,dynamic-programming,catalan,Recursion,Dynamic Programming,Catalan,我想使用动态规划技术编写一个算法,它可以执行以下操作: 求沿具有n×n个正方形单元的网格边的单调路径数,这些路径不经过对角线上方。单调路径从左下角开始,到右上角结束,完全由指向右侧或向上的边组成 我有一些想法,但不知道如何正确执行。首先,通过解决退化情况(一个0 x 0网格),为递归找到一个基础。然后通过想象问题的这一部分来寻找一个重复步骤,比如说,kxm已经解决了,然后看看是否可以通过向该解决方案添加一行或一列来扩展该解决方案,使该解决方案成为K+1xm或kxm+1。这应该很简单:对于添加的每

我想使用动态规划技术编写一个算法,它可以执行以下操作: 求沿具有n×n个正方形单元的网格边的单调路径数,这些路径不经过对角线上方。单调路径从左下角开始,到右上角结束,完全由指向右侧或向上的边组成


我有一些想法,但不知道如何正确执行。

首先,通过解决退化情况(一个
0 x 0
网格),为递归找到一个基础。然后通过想象问题的这一部分来寻找一个重复步骤,比如说,
kxm
已经解决了,然后看看是否可以通过向该解决方案添加一行或一列来扩展该解决方案,使该解决方案成为
K+1xm
kxm+1
。这应该很简单:对于添加的每个点,查看网格点是否位于对角线下方,然后从底部和左侧添加指向该点的路径数。其中一个点位于
K x M
中,另一个点位于您正在构建的其他行或列中


使用退化情况和递归步骤,首先解决
0 x N
问题,然后解决
1 x N
,然后解决
2 x N
,依此类推,直到得到
N x N
解决方案

这里有一个可能的递归,它只考虑正方形网格

在n×n网格上有两种不与对角线相交的单调路径:那些在0
  • 首先在(i,i)处接触对角线的n×n网格上的路径可以分为两条:一条路径在不接触对角线的i×i网格上,另一条路径在(n-i)×(n-i)网格上,它们可以接触对角线。这表明,您可以使用考虑所有可能i的递归来计算这些值

  • 不接触对角线的路径将以“右”开始,以“向上”结束。在这两个移动之间是(n-1)×(n-1)网格上的单调路径,该网格不穿过对角线,但可能接触到对角线


我们在这里计算的是n。如果要验证递归计算,有一个公式。

让到达坐标
(i,j)
的路径数
p(i,j)
。因此(假设左下角为
(0,0)
):

您可以进一步设置坐标不低于对角线的条件。也就是说:
i
范围从
0..n
j
范围从
0..n
,但
i
P(i,j) = P(i-1,j) + P(i,j-1)