网站建设与维护南昌网站建设

宁波好聚房产营销策划有限公司安阳龙安分公司 2026/09/09 17:55:13

题目描述:leetcode​

有一段楼梯,总共有 n 级台阶。
每次你可以爬 1 级或者 2 级。
问:从第 0 级(地面)出发,爬到第 n 级,一共有多少种不同的走法?

示例:
n = 2,答案是 2:
1 + 1
2
n = 3,答案是 3:
1 + 1 + 1
1 + 2
2 + 1

leetcode​

约束:1 <= n <= 45。leetcode​

这道题是 LeetCode 非常经典的一维动态规划题,也是入门斐波那契型 DP 的好例子。leetcode​

初始思路:从「走的步数」出发(错误思路)

一开始容易这样想:
定义 dp[i] 表示「走了 i 步之后,总共爬了多少级台阶」。
每一步可以走 1 或 2 级,于是尝试在循环里不断累加:
每次选择 1 或 2 作为步长。
如果刚好走到 n,就认为找到一种方案。

这个思路的问题:
dp[i] 存的是「位置」(台阶数),题目需要的是「方案数」,状态含义不匹配。
转移类似写成 dp[i] = dp[i - 1] + choice,其中 choice 是 1 或 2,是步长,不是方案数量。
为了数方案,再去判断 if (dp[i] == n) 可能性++,会导致枚举路径、逻辑复杂且容易漏解。

总结:
把「位置」和「方案数」混在一个状态里,是这个方向的根本问题。
想用 DP 解决计数类问题,dp[i] 更适合作为「第 i 个状态 有多少种方案」。

正确的状态定义:到达某一级的方案数

更自然的定义是:
dp[i] 表示「到达第 i 级台阶,有多少种不同的走法」。
这样定义之后,题目问的「到达第 n 级有多少种走法」,就可以直接对应到 dp[n]。

接下来思考转移:
想到达第 i 级台阶,上一步可能在哪?
如果上一步走 1 级,那上一步在第 i - 1 级;
如果上一步走 2 级,那上一步在第 i - 2 级。

所以,到达第 i 级的所有方案,就是:
所有「先到第 i - 1 级,再走 1 级」的方案
加上所有「先到第 i - 2 级,再走 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]

这就是一个标准的斐波那契数列形式。leetcode​

初始条件的两种写法

有了转移方程,还需要考虑边界(初始状态)。常见有两种写法。

写法 A:从 0 级开始递推

把「地面」当作第 0 级台阶:
dp[0] = 1
含义:在第 0 级台阶,有 1 种方式——什么都不做。
dp[1] = 1
含义:到达第 1 级,只能从第 0 级走 1 步上来,所以也只有 1 种方式。

然后从 i = 2 开始,用转移方程递推到 n:
dp[i]=dp[i−1]+dp[i−2],i≥2dp[i] = dp[i - 1] + dp[i - 2], quad i ge 2dp[i]=dp[i−1]+dp[i−2],i≥2

最终答案是 dp[n]。leetcode​

这种写法的特点:
数组大小一般开到 n + 1,下标从 0 到 n 都有意义。
边界统一自然,和斐波那契常见写法类似。

写法 B:从 1 级开始递推

也可以从 1 级台阶开始定义边界:
dp[1] = 1:到第 1 级只有「1」这一种走法。
dp[2] = 2:到第 2 级有两种走法:「1+1」和「2」。

然后从 i = 3 开始,使用同样的转移方程:
dp[i]=dp[i−1]+dp[i−2],i≥3dp[i] = dp[i - 1] + dp[i - 2], quad i ge 3dp[i]=dp[i−1]+dp[i−2],i≥3

最终同样输出 dp[n]。

这种写法的特点:
不直接用 dp[0],只在 1 到 n 的范围内活动。
对于有些人来说,从「第 1 级」开始会更直观。

注意:
如果采用写法 B,代码里即使有 dp[0],它也不会被用到,所以它取 0 或 1,在实际计算中都不影响结果,但从语义上讲,一般依然认为「到第 0 级有 1 种方式」。

一维 DP 解法总结

将上面的讨论整理成统一的 DP 思路:

状态定义:
dp[i] 表示「到达第 i 级台阶的不同走法数量」。

转移方程:
dp[i] = dp[i - 1] + dp[i - 2],因为上一步只能从 i - 1(走 1 级)或 i - 2(走 2 级)来。

初始条件(以写法 A 为例):
dp[0] = 1
dp[1] = 1

计算顺序:
从小到大,依次计算 dp[2], dp[3], …, dp[n]。

答案:
返回 dp[n]。leetcode​

时间复杂度和空间复杂度:
时间复杂度:O(n),只需要一遍循环。
空间复杂度:
用数组是 O(n);
由于每次只依赖 dp[i-1] 和 dp[i-2],可以只用两个变量滚动,空间优化到 O(1)。leetcode​

一点延伸:为什么是斐波那契

从递推关系可以看出:
dp[1] = 1
dp[2] = 2
dp[3] = dp[2] + dp[1] = 3
dp[4] = dp[3] + dp[2] = 5
dp[5] = dp[4] + dp[3] = 8
……

这正是斐波那契数列平移后的形式:每一项等于前两项之和。leetcode​

这类题的关键点在于:
把「路径数」定义成状态,而不是「当前位置」;
搞清楚「当前状态」能由哪些「前一个状态」一步转移过来;
将所有可能的前驱状态的方案数累加起来,构成当前的方案数。

掌握了这道题,之后看「跳台阶」「爬楼梯变种」「一步可以跳 1/2/3 级」等等题目,就会自然地套用:
「能从哪些位置跳过来」
「把这些位置的方案数加起来」。

https://leetcode.com/problems/climbing-stairs/?envType=study-plan-v2&envId=top-interview-150

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

网站建设定制网站建设是什么

从零搭建MIPS/RISC-V的ALU:图解+代码,教学实验一次讲透你有没有过这样的经历?翻开《计算机组成与设计》,看到ALU那张密密麻

2026/06/30 12:35:02

荆州网站建设辽宁省建设厅网站

突破数学推理瓶颈:DeepSeek-Prover-V1.5开创形式化反馈训练新范式【免费下载链接】DeepSeek-Prover-V1通过大规模合成数据,DeepSeek-

2026/06/30 13:24:35

建设部网站长沙营销型网站建设

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常

2026/06/30 12:01:28

网站建设步骤网站外链建设

如何快速上手PyScaffold:终极Python项目模板生成器指南【免费下载链接】pyscaffold🛠 Python project template generat

2026/06/30 12:59:04

南京网站建设贵州网站建设

GoCV实战:打造跨平台计算机视觉应用界面【免费下载链接】gocvhybridgroup/gocv: 是一个基于 Go 语言的开源计算机视觉库,支持多种计算机视觉算法和工具

2026/06/30 12:10:59

济宁网站建设网站建设公司哪个好

你是否曾经因为忘记Apple ID密码,或者购买的二手设备存在激活锁而无法正常使用iPhone或iPad?AppleRa1n这款专业的iOS设备解锁工具正是为解决这类问题而

2026/06/30 14:14:10

郑州网站建设十堰网站建设

分段加载终极指南:快速解决千万级文档加载性能瓶颈【免费下载链接】MaxKB强大易用的开源企业级智能体平台项目地址: https://gitcode.com/feizhiyun/MaxKB

2026/06/30 10:04:48

寿光网站建设绍兴网站建设

快速体验打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容:创建一个详细的CUDA驱动安装指南文档,包含Windows和L

2026/06/30 14:02:08

南昌网站建设莱州网站建设

BG3ModManager终极指南:从零到精通的模组管理实战【免费下载链接】BG3ModManagerA mod manager for Baldur's Gate 3.项目地址

2026/06/30 13:51:07