1D青蛙跳DP问题的二维推广:带步长限制的路径计数求解咨询
1D青蛙跳DP问题的二维推广:带步长限制的路径计数求解咨询
嗨,看起来你已经从一维青蛙跳问题摸到了二维路径计数的核心门道,这个思路方向完全没问题!先给你点个赞~
先把你的问题明确下:
一只青蛙从点A$(0,0)$跳到点B$(5,6)$,每一步只能向右或向上走1单位或2单位,求总路径数。你已经知道一维下
f(i) = f(i-1)+f(i-2)的递推关系,想知道二维是不是可以推广为$f(i,j) = f(i-1,j)+f(i-2,j)+f(i,j-1)+f(i,j-2)$?
没错,这个递推式完全正确!下面给你拆解清楚逻辑、边界条件和计算步骤:
递推式的逻辑解释
首先我们定义$f(i,j)$为从$(0,0)$走到$(i,j)$的总路径数,要走到$(i,j)$,最后一步只能是以下四种合法情况之一:
- 从左边$(i-1,j)$跳1单位向右抵达 → 对应路径数$f(i-1,j)$
- 从左边$(i-2,j)$跳2单位向右抵达 → 对应路径数$f(i-2,j)$
- 从下边$(i,j-1)$跳1单位向上抵达 → 对应路径数$f(i,j-1)$
- 从下边$(i,j-2)$跳2单位向上抵达 → 对应路径数$f(i,j-2)$
根据加法原理,把这四种情况的路径数相加,就是走到$(i,j)$的总路径数,完全符合逻辑。
关键的边界条件处理
这部分不能忽略,否则计算会出错:
- 起点初始值:$f(0,0) = 1$(只有1种方式待在起点)
- 非法坐标处理:当$i<0$或$j<0$时,$f(i,j) = 0$(不存在负数坐标的点,所以路径数为0)
- 边缘行/列的特殊处理:
- 当$i=0$(只能向上跳):$f(0,j) = f(0,j-1)+f(0,j-2)$,这就是一维青蛙跳问题的递推,比如$f(0,1)=1$,$f(0,2)=2$,$f(0,3)=3$以此类推
- 当$j=0$(只能向右跳):$f(i,0) = f(i-1,0)+f(i-2,0)$,同样遵循一维青蛙跳的规则
计算到$(5,6)$的具体步骤
你可以按行或按列填充DP表,这里给你列关键节点的计算示例:
- 先填充第一行($i=0$,$j$从0到6):
$f(0,0)=1$,$f(0,1)=1$,$f(0,2)=2$,$f(0,3)=3$,$f(0,4)=5$,$f(0,5)=8$,$f(0,6)=13$ - 再填充第一列($j=0$,$i$从0到5):
$f(0,0)=1$,$f(1,0)=1$,$f(2,0)=2$,$f(3,0)=3$,$f(4,0)=5$,$f(5,0)=8$ - 逐步填充其他单元格,比如:
$f(1,1)=f(0,1)+f(-1,1)+f(1,0)+f(1,-1)=1+0+1+0=2$
$f(1,2)=f(0,2)+f(-1,2)+f(1,1)+f(1,0)=2+0+2+1=5$
按照这个规则一步步计算到$f(5,6)$,最终结果为1445。
补充说明
如果遇到更大的坐标,这个递推式依然适用,只要正确处理边界条件即可。你也可以用记忆化递归的方式实现,避免重复计算,不过对于$(5,6)$这种小坐标,直接迭代填充DP表会更简单高效。
备注:内容来源于stack exchange,提问作者Ri-Li
相关产品推荐
相关产品推荐

