有限制的楼梯攀登 | 豆包MarsCode AI刷题

53 阅读2分钟

一、题目解析

题目描述
小U想挑战一座高楼梯,每次可以选择走 一步或两步,但不能连续走两步。我们需要计算在给定的楼梯层数 nnn 下,小U总共有多少种不同的走法。

规则总结

  1. 每次可以走 1 步或 2 步。
  2. 不能连续走两步,即连续 "2,2" 组合是无效的。

目标
在给定楼梯层数 n 下,计算合法的走法总数。


二、解题思路

本问题可以用动态规划解决,构造出递推关系来计算所有可能的走法。

  1. 定义状态
    定义 dp[i]dp[i]dp[i] 为走到第 iii 阶楼梯的方法总数。

  2. 状态转移

    • 如果当前选择走 1 步,则前一步可以是任何合法状态: dp[i]←dp[i−1]dp[i] \gets dp[i-1]dp[i]←dp[i−1]
    • 如果当前选择走 2 步,则前一步必须是走 1 步: dp[i]←dp[i]+dp[i−2]dp[i] \gets dp[i] + dp[i-2]dp[i]←dp[i]+dp[i−2]

    合并得到:

    dp[i]=dp[i−1]+dp[i−2]dp[i] = dp[i-1] + dp[i-2]dp[i]=dp[i−1]+dp[i−2]

  3. 初始化

    • dp[1]=1dp[1] = 1dp[1]=1:只有一步时,走法只有 1 种。
    • dp[2]=2dp[2] = 2dp[2]=2:两步时,有两种走法:[1,1][1, 1][1,1] 或 [2][2][2]。
  4. 结果计算
    遍历从第 3 阶楼梯到第 nnn 阶楼梯,累积合法走法。


三、代码实现

以下是基于上述思路的 Python 实现:

python
复制代码
def solution(n):
    # 特殊情况:楼梯层数小于 1
    if n == 0:
        return 0
    if n == 1:
        return 1
    
    # 初始化 dp 数组
    dp = [0] * (n + 1)
    dp[1] = 1
    dp[2] = 2

    # 动态规划计算每一阶的走法
    for i in range(3, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]
    
    return dp[n]

# 测试用例
if __name__ == "__main__":
    print(solution(2) == 2)  # 两种走法:[1, 1], [2]
    print(solution(3) == 3)  # 三种走法:[1, 1, 1], [1, 2], [2, 1]
    print(solution(4) == 5)  # 五种走法:[1, 1, 1, 1], [1, 2, 1], [1, 1, 2], [2, 1, 1], [2, 2]

四、知识总结

  1. 动态规划的构造
    本题通过定义状态 dp[i]dp[i]dp[i],利用前两步的走法数推导当前楼梯的走法数,体现了动态规划的基本思想。

  2. 递推公式的推导

    • dp[i]=dp[i−1]+dp[i−2]dp[i] = dp[i-1] + dp[i-2]dp[i]=dp[i−1]+dp[i−2]:选择走 1 步或 2 步时分别对应的状态转移。
  3. 边界条件的处理
    楼梯步数小于 2 的特殊情况需单独处理。