第五题——面试题 08.01. 三步问题

动态规划(简单)

前言

纯个人笔记,记录自己动态规划学习次序与题目(大多为力扣的题目)方便复习查找。
本人学习使用的是c++,纯纯纯新手有写的不对的地方,非常欢迎来提醒
对于我这个新手来说大部分的题是很难做出来,肯定会借鉴相应的题解和解析,如果有争议,我会删除

题目

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

示例1:
输入:n = 3
输出:4
说明: 有四种走法

示例2:
输入:n = 5
输出:13

提示:
n范围在[1, 1000000]之间

代码

class Solution {
public:
    int waysToStep(int n) 
    {
        if(n<=2)//特殊情况,返回
            return n;
        if(n==3)//特殊情况,返回
            return 4;
        vector<long long > dp(n+1);
        dp[1]=1;
        dp[2]=2;
        dp[3]=4;
        for(int i=4;i<=n;i++)
        {
            dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007;
        }
        return dp[n];
    }
};

解释

1、dp定义
因为计算小孩有多少种上楼梯的方式,dp[i]代表到第 i 个台阶的上楼梯的方法数。因为 i 最大为 n ,而 n 范围在[1, 1000000]之间,数量巨大所以定义long long 类型。
2、递推公式
dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007;
爬楼梯使用最小花费爬楼梯 题特别相似,只不过有三种跳法;
(1) 从 i-1 开始,爬一阶台阶,到达 i ,i-1 之前有dp[i-1]种方法;
(2) 从 i-2 开始,爬两阶台阶,到达 i ,i-1 之前有dp[i-2]种方法 ;
(3) 从 i-3 开始,爬三阶台阶,到达 i ,i-1 之前有dp[i-3]种方法;
即 dp[i]为以上三种情况之和->dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
因为题目要求你需要对结果模1000000007。 所以dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007;
3、dp初始化
因为递推公式是由 dp[i-1] 和 dp[i-2] 和 dp[i-3] 决定的,所以初始化 dp[1] 和 dp[2] 和 dp[3] 。
dp[1]是到第一个台阶的时候的上楼梯的几种方法,1,共一种->dp[1]=1;
dp[2]是到第两个台阶的时候的上楼梯的几种方法,1-1,2,共两种->dp[2]=2;
dp[3]是到第三个台阶的时候的上楼梯的几种方法,1-1-1,1-2,2-1,3 共四种->dp[3]=4;

终于自己做对了一道题,太不容易了,第一次定义的 int 型,执行出错,后改成long long 型就过了,虽然题很简单,但是自己做出来的还是开心^ _ ^

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值