leetcode 70爬楼梯

复制代码
class Solution {
public:
    int climbStairs(int n) {
        if(n <= 2) return n;

        vector<int> dp(n + 1);

        // dp[i]:到达第 i 个台阶有几种方法
        dp[1] = 1;
        dp[2] = 2;

        for(int i = 3; i <= n; i++){
            // 最后一步走1阶或2阶
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        return dp[n];
    }
};

总结

这道题最重要的是理解:

复制代码
dp[i]

表示:

到达第 i 个台阶,一共有多少种方法。

到达第 i 阶,最后一步只有两种可能:

① 从第 i-1 阶走 1 步

复制代码
dp[i-1]

② 从第 i-2 阶走 2 步

复制代码
dp[i-2]

所以:

复制代码
dp[i] = dp[i-1] + dp[i-2];

为什么 dp[1] = 1,dp[2] = 2?

复制代码
第1阶:
1

只有一种。

复制代码
第2阶:
1 + 1
2

有两种。

所以:

复制代码
dp[1] = 1;
dp[2] = 2;

然后不断往后推:

复制代码
dp[1] = 1
dp[2] = 2
dp[3] = 3
dp[4] = 5
dp[5] = 8
...

你这次解决的两个易错点

① vector 大小

复制代码
vector<int> dp(n + 1);

因为需要访问:

复制代码
dp[n]

所以必须开 n + 1 个位置。


② n <= 2 的边界

复制代码
if(n <= 2) return n;

避免 n = 1 时还去访问:

复制代码
dp[2]

导致越界。


最后记住这个 DP 模板

复制代码
1. 定义 dp[i]:第 i 个状态代表什么
2. 找最后一步/最后一个状态怎么来的
3. 写状态转移方程
4. 初始化最前面的状态
5. 从前往后推
6. 返回 dp[n]

这道题就是最基础的线性 DP,核心公式:

复制代码
dp[i] = dp[i - 1] + dp[i - 2];

本质上就是斐波那契数列。

相关推荐
垆边人似月.1 小时前
最长递增子序列的个数(200分 / 动态规划)
算法·动态规划
镜子AI1 小时前
教培机构多模态内容跨模态检索系统:基于CLIP的统一表征与图文混合召回算法
人工智能·python·算法·机器学习
小宋10211 小时前
合成评测集怎么造才不“自嗨”:自动出题、去重、泄漏检测与人工抽检
人工智能·算法·机器学习
蒸蒸yyyyzwd2 小时前
秋招笔记day58
算法·哈希算法
Jasmine_llq2 小时前
《P5663 [CSP-J 2019] 加工零件》
数据结构·算法·bfs·广度优先搜索·分层 bfs /·奇偶分层最短路·奇数最短步数
在所不辞兄2 小时前
分层PINN提升多物理场一致性
人工智能·神经网络·算法·机器学习·工程仿真
wanderist.2 小时前
CSP 第43次认证 T4:集合划分 —— 图染色与二分图判定
算法·图论
不做无法实现的梦~2 小时前
基于 PX4 的全仓库架构、无人机算法解析与开发学习规划
算法·架构·无人机
做cv的小昊2 小时前
【大模型算法自学笔记01】NLP基础知识(1.1 自注意力)
人工智能·笔记·算法·自然语言处理·大模型·llm