当前位置: 首页 > news >正文

动态规划入门1 - 爬楼梯问题,从递归到动态规划的完美演绎

一、题目描述

你正在爬一座楼梯。它有 n 个台阶。
每次你可以爬 1 个台阶2 个台阶

问:你有多少种不同的方法可以爬到楼顶?

二、举个例子

比如:

  • n = 1 时:只有 [1] 一种走法

  • n = 2 时:有两种走法 [1+1][2]

  • n = 3 时:

    • 先爬 1 阶 → 剩下 2 阶的走法有 2 种

    • 先爬 2 阶 → 剩下 1 阶的走法有 1 种
      所以总共有 2 + 1 = 3 种。

也就是:

f(1) = 1
f(2) = 2
f(3) = f(2) + f(1) = 3

三、递归思路:分解问题

每次你到第 n 阶,只可能是从:

  • n-1 阶(再走 1 步)

  • n-2 阶(再走 2 步)

所以:

f(n) = f(n-1) + f(n-2)

这其实和 斐波那契数列 完全一样。

对应的递归代码:

class Solution {int dfs(int i) {if (i <= 1) return 1;   // base casereturn dfs(i - 1) + dfs(i - 2);}
public:int climbStairs(int n) {return dfs(n);}
};

理解关键:

  • dfs(i) 表示 “到第 i 阶的走法数”。

  • 如果只有 1 阶或 0 阶,走法只有 1 种。

  • 每一步要么来自 i-1 阶,要么来自 i-2 阶。
    所以自然相加。

四、递归的缺陷:重复计算

比如求 f(5)

       f(5)/   \f(4)   f(3)/ \     / \f(3) f(2) f(2) f(1)

你会发现 f(3)f(2) 被重复计算了好多次。

→ 所以我们引入 记忆化搜索动态规划

五、动态规划解法(自底向上)

class Solution {
public:int climbStairs(int n) {vector<int> f(n + 1);f[0] = f[1] = 1;    // base case:0阶和1阶都只有一种走法for (int i = 2; i <= n; i++) {f[i] = f[i - 1] + f[i - 2];}return f[n];}
};

思想解释:

  • f[i] 表示到第 i 阶的走法数。

  • 对于每个 i

    • 从第 i-1 阶走一步上来 → 有 f[i-1] 种方式;

    • 从第 i-2 阶走两步上来 → 有 f[i-2] 种方式;

    • 两者加起来就是总走法数。

if[i]说明
01什么都不做,一种方式
11[1]
22[1+1], [2]
33[1+1+1], [1+2], [2+1]
45[1+1+1+1], [1+1+2], [1+2+1], [2+1+1], [2+2]
58共 8 种走法

七、优化:只存两个变量

其实我们每次只用到前两个状态,可以优化为 O(1) 空间:

int climbStairs(int n) {if (n <= 1) return 1;int a = 1, b = 1;for (int i = 2; i <= n; i++) {int c = a + b;a = b;b = c;}return b;
}

八、核心总结

思路特点时间复杂度空间复杂度
递归简单直观,但有重复计算O(2ⁿ)O(n)
记忆化搜索缓存结果O(n)O(n)
动态规划自底向上O(n)O(n)
滚动变量最优O(n)O(1)

九、最后一点思考

很多人一开始会问:

为什么不是 f[i] = f[i-1] + f[i-2] + 2 呢?

其实 f[i] 记录的是「走法数」,不是「步数的和」。
那最后一步(+1 或 +2)已经包含在走法里面了,不需要再额外加。

所以这道题不仅是动态规划的入门题,
更是理解「状态表示」和「状态转移」的完美练习。

或者这么说

            从 i-1 阶走 1 步上来(这时所有能到 i-1 的走法,都可以 +1 步到 i)从 i-2 阶走 2 步上来(这时所有能到 i-2 的走法,都可以 +2 步到 i)
http://www.dtcms.com/a/530255.html

相关文章:

  • 【GTest 】GTest 详解以及安装教程
  • 网站建设的实践报告怎么查询自己的二建信息
  • 高端品牌网站建设案例网站开发方向学啥
  • 绿色做环保网站的好处主机如何做服务器建网站
  • 宜宾网站建设宜宾wordpress用户筛选
  • 华为自助建站做钓鱼网站要具备什么
  • 企业营销型网站制作多少钱杭州cms建站模板
  • 怎么做简单地网站网站的备案流程
  • 网站开发能进入无形资产吗太原百度做网站多少钱
  • 【gflags 】gflags 详解以及安装教程
  • 网站系统 建设和软件岗位职责微信小程序一起生活怎么注册
  • 网站 vps网站开发的流程
  • 做区块链网站的公司郑州网站开发定制
  • 网店网站建设哪家ppt模板免费背景
  • 医院网站内链优化百度一下你就知道官网网页
  • 论坛型网站 建站dede网站前台没有图片
  • 宿迁网站建设宿迁网站设计开发收费标准
  • Java—多态
  • 博客网站搭建中工信融网站建设
  • 织梦网站维护工商网企业信息查询系统营业执照
  • 做企业网站的研究现状祥云网站建设公司 概况
  • 现在的网站使用frameset做吗天津建设工程招标网
  • 20252803-动态库的使用-openssl
  • 网站建设平台哪个好推广产品的方式有哪些
  • 制作网站的花多少钱一级a做爰片2017免费网站
  • 怎样创建网站教程网站主机多少钱
  • 湘潭网站建设优选磐石网络网页翻译网站
  • 网站建设企业 熊账号如何制作wordpress主题
  • 27_AI智能体提示词工程之动态加载情感分析提示词模板的最佳实践
  • Windows 中启动 ms office 报错0xc0000142