|
楼主 |
发表于 2024-5-11 22:20
|
显示全部楼层
例题1:
有n级台阶,每次只能上1或2级台阶,问从地面开始上到第n级台阶共有多少种上法。
下面我们最开始来分析一下,如何推理出转移状态方程。
当要上到第1级台阶时,只有一种走法,从地面上一级台阶。
当要上到第2级台阶时,有两种走法,一种是一次性上到第2级台阶,一种是每次走一级台阶。
当要上到第3级台阶时一共有几种走法呢?因为每次能上1级或2级,所以到第3级台阶可能是从第1级台阶迈两级台阶而来,也可能是从第2级台阶迈一级台阶而来。所以,上到第3级台阶的走法=上到第1级的走法+上到2级的走法,如果使用dp来表示上到第i级台阶的走法,可以写成dp[3]=dp[1]+dp[2]。
当要上到第4级台阶时道理一样,dp[4]=dp[2]+dp[3],后面可以以此类推,规律是:上到第i个台阶时的走法=上到第i-2个台阶的走法+上到第i-1个台阶的走法,因此可以推出转移状态方程:dp=dp[i-2]+dp[i-1]。
在具体使用公式解决时(5级台阶为例),我们可以将第1级和第2级的走法作为初始值,也即{1;2}:
- =MAX(REDUCE({1;2},SEQUENCE(5-2),LAMBDA(x,y,VSTACK(x,SUM(TAKE(x,-2))))))
复制代码
上述公式中SEQUENCE里的5是台阶总数,-2是减去已放入初始值的前两个台阶的走法。TAKE函数每次取x中的最后两行求和作为到第i级台阶时的走法,堆叠在x下方。当然,也可以改变堆叠方式:
- =@REDUCE({2;1},SEQUENCE(5-2),LAMBDA(x,y,VSTACK(SUM(TAKE(x,2)),x)))
复制代码 前面的公式适用于2级以上台阶的情况,也可以在写DP时考虑作出虚拟的初始值来适应从第一级台阶开始的情况,例如:
- =@REDUCE({1;0},SEQUENCE(5),LAMBDA(x,y,VSTACK(SUM(TAKE(x,2)),x)))
复制代码
|
|