动态规划爬楼梯

爬楼梯问题是动态规划的经典入门题,咱们用 Python 实现时核心是抓住状态转移的逻辑~ 我来一步步拆解给你看:


问题描述

假设你需要爬 n 阶楼梯,每次可以爬 1 步或 2 步。问到达第 n 阶共有多少种不同的方法?


动态规划思路

动态规划的核心是「状态定义」和「状态转移」。

1. 状态定义

定义 dp[i] 为到达第 i 阶楼梯的方法数(即我们要求的答案)。

2. 状态转移

要到达第 i 阶楼梯,只有两种方式:

  • 从第 i-1 阶爬 1 步上来 → 方法数为 dp[i-1]
  • 从第 i-2 阶爬 2 步上来 → 方法数为 dp[i-2]
    因此,状态转移方程为:dp[i] = dp[i-1] + dp[i-2]

3. 初始条件

  • i=1 时(只有 1 阶),只能爬 1 步 → dp[1] = 1
  • i=2 时(有 2 阶),可以爬两次 1 步或一次 2 步 → dp[2] = 2

Python 代码实现

根据上面的思路,我们可以用迭代的方式计算(空间优化版,不需要保存整个数组):

def climb_stairs(n: int) -> int:
    if n <= 2:
        return n  # 边界条件:n=1返回1,n=2返回2
    
    # 用两个变量滚动记录前两阶的方法数(优化空间)
    prev, curr = 1, 2  # dp[1]=1, dp[2]=2
    for i in range(3, n+1):
        next_val = prev + curr  # 计算当前阶的方法数
        prev, curr = curr, next_val  # 滚动更新前两阶的值
    
    return curr

# 测试示例
print(climb_stairs(3))  # 输出3(1+1+1, 1+2, 2+1)
print(climb_stairs(4))  # 输出5(1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2)

复杂度分析

  • 时间复杂度:O(n),只需遍历一次从 3 到 n 的楼梯阶数。
  • 空间复杂度:O(1),仅用了 3 个变量保存中间状态(优化后)。

扩展思考

如果题目改为「每次可以爬 1、2、…、k 步」,状态转移方程会变成 dp[i] = dp[i-1] + dp[i-2] + ... + dp[i-k](需注意边界条件)。这种情况下可以用滑动窗口或前缀和进一步优化~ 有兴趣的话可以试试扩展实现哦! 😊

  • Avatar photo

    宁妄

    一个热爱自然却被困在代码世界的“人”

    Related Posts

    阶段测评—循环前

    基础概念类 输入输出类 数学操作符类 列表类 if 语句类 …

    全排列问题

    一、next_permutation函数(生成下一个字典序排…

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注