题目描述
思路解析动画文字版
只贪心踩便宜阶会被后面的选择反噬。
dp[i] 表示到达第 i 阶前的最小花费,从 i-1 或 i-2 转移。
1. dp[0]=dp[1]=0 免费起步:上行是各阶的离开费 cost,下行是 dp(到达该阶的最小花费)。先填 dp[0]=dp[1]=0。
2. dp[2] = min(两条来路) = 10:到阶2有两条来路:从阶1走1步(付 cost[1]=15) 或 从阶0跳2步(付 cost[0]=10)。取 min → dp[2]=10。
3. dp[3](顶) = min(两条来路) = 15:到顶(阶3):从阶2走1步(付 20) 得 30,或从阶1跳2步(付 15) 得 15。取 min → dp[3]=15。
4. 关键帧 · 每阶取两条来路的 min:关键帧:每个台阶 dp[i] 都从「前一阶 +cost[i−1]」和「前两阶 +cost[i−2]」里取较小的。到顶 dp[3]=15 就是答案。
5. 最省路线:回溯最省路线:从阶 1 免费起步,花 15 一步跳两阶到顶,总花费 15。注意楼顶本身不付费。
一句话记住:dp[i] 表示到达第 i 阶前的最小花费,从 i-1 或 i-2 转移。
边界三连:三种情况先想清楚。
面试追问 1:状态与转移。
面试追问 2:滚动数组优化。
面试追问 3:与 LC70 的关系。
这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=dp 连刷同类题;卡住时用 AI 答疑问“我的状态定义哪里不稳”。
参考代码
class Solution: def minCostClimbingStairs(self, cost): a = b = 0 for i in range(2, len(cost) + 1): a, b = b, min(b + cost[i - 1], a + cost[i - 2]) return b复杂度
- 时间复杂度:O(n),扫一遍台阶,每阶 O(1) 转移
- 空间复杂度:O(1),dp[i] 只依赖前两项,用两个滚动变量即可
可套用的代码模板
骨架:dp[i] 取「前一阶」「前两阶」两条来路的 min,用两个滚动变量省空间。
Python
# 爬楼梯最小花费骨架 · 滚动变量a = b = 0 # dp[0]=dp[1]=0for i in range(2, len(cost)+1): a, b = b, min(b + cost[i-1], a + cost[i-2]) # 两条来路取 minreturn b # b = dp[n] = 到顶易错点
面试追问把动画讲成自己的话
追问核心状态与转移是什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
打家劫舍
LeetCode 198 · 中等 · 沿着 一维动态规划 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题