dp经典问题:爬楼梯

dp经典问题:爬楼梯


爬楼梯

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

Step1: 识别问题

这个问题要求我们计算 小孩上到第n阶台阶有多少种方法

Step2:定义状态

d p [ i ] < − 小孩上到第 n 阶台阶的方法数量,定义为第 i 个状态 dp[i] <- 小孩上到第n阶台阶的方法数量,定义为 第 i 个状态 dp[i]<−小孩上到第n阶台阶的方法数量,定义为第i个状态

Step3:确定状态转移方程

这里 小孩每次可以上1阶,2阶或3阶 ,也就是说小孩可以从前1阶,2阶或者3阶上到当前台阶

也就是说当前状态由前三个状态决定

d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] + d p [ i − 3 ] dp[i]=dp[i-1]+dp[i-2]+dp[i-3] dp[i]=dp[i−1]+dp[i−2]+dp[i−3]

Step4:确定初始状态和边界

d p [ 0 ] = 1 d p [ 1 ] = 1 d p [ 2 ] = 2 d p [ 3 ] = 4 dp[0]=1\\ dp[1]=1\\ dp[2]=2\\ dp[3]=4 dp[0]=1dp[1]=1dp[2]=2dp[3]=4

Step5:计算目标状态值

只需要从第四个状态开始自下而上的状态推导即可

代码

cpp 复制代码
class Solution {
public:
    int waysToStep(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        if (n == 3) return 4;

        vector<int> dp(n + 1);
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;
        const int mod = 1000000007;

        for (int i = 4; i <= n; ++i) {
            dp[i] = ((dp[i - 1] + dp[i - 2]) % mod + dp[i - 3]) % mod;
        }
        return dp[n];
    }
};
相关推荐
lLinkl10 分钟前
LeetCode-1.两数之和
算法·leetcode·散列表
(❁´◡`❁)Jimmy(❁´◡`❁)11 分钟前
F - Manhattan Christmas Tree 2
数据结构·算法
wxdlfkj12 分钟前
从算法溯源到硬件极限:解决微小球面小角度拟合与中心定位的技术路径
人工智能·算法·机器学习
高洁0113 分钟前
基于Tensorflow库的RNN模型预测实战
人工智能·python·算法·机器学习·django
一起养小猫16 分钟前
LeetCode100天Day5-最小长度子数组与三数之和
算法·leetcode·职场和发展
小龙报17 分钟前
【初阶数据结构】从 “数组升级” 到工程实现:动态顺序表实现框架的硬核拆解指南
c语言·数据结构·c++·算法·机器学习·信息与通信·visual studio
多米Domi01123 分钟前
0x3f第九天复习(考研日)(10.57-14:00)
python·算法
byzh_rc31 分钟前
[模式识别-从入门到入土] 拓展-EM算法
算法·机器学习·概率论
努力学算法的蒟蒻33 分钟前
day41(12.22)——leetcode面试经典150
算法·leetcode·面试
liliangcsdn34 分钟前
Python拒绝采样算法优化与微调模拟
人工智能·算法·机器学习