一、题目解析
题目描述
小U想挑战一座高楼梯,每次可以选择走 一步或两步,但不能连续走两步。我们需要计算在给定的楼梯层数 nnn 下,小U总共有多少种不同的走法。
规则总结
- 每次可以走 1 步或 2 步。
- 不能连续走两步,即连续 "2,2" 组合是无效的。
目标
在给定楼梯层数 n 下,计算合法的走法总数。
二、解题思路
本问题可以用动态规划解决,构造出递推关系来计算所有可能的走法。
-
定义状态
定义 dp[i]dp[i]dp[i] 为走到第 iii 阶楼梯的方法总数。 -
状态转移
- 如果当前选择走 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]
-
初始化
- dp[1]=1dp[1] = 1dp[1]=1:只有一步时,走法只有 1 种。
- dp[2]=2dp[2] = 2dp[2]=2:两步时,有两种走法:[1,1][1, 1][1,1] 或 [2][2][2]。
-
结果计算
遍历从第 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]
四、知识总结
-
动态规划的构造
本题通过定义状态 dp[i]dp[i]dp[i],利用前两步的走法数推导当前楼梯的走法数,体现了动态规划的基本思想。 -
递推公式的推导
- 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 步时分别对应的状态转移。
-
边界条件的处理
楼梯步数小于 2 的特殊情况需单独处理。