Leetcode刷题详解——三步问题

1. 题目链接:面试题 08.01. 三步问题

2. 题目描述:

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

示例1:

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

示例2:

 输入:n = 5
 输出:13

提示:

  1. n范围在[1, 1000000]之间

3. 算法(动态规划)

3.1 算法思路:

  1. 状态表示

    这道题可以根据【经验+题目要求】直接定义出状态表示:

    dp[i]表示:达到i位置时,一共多少种方法

  2. 状态转移方程

    dp[i]表示小孩上第i阶楼梯的所有方式,那么它应该等于所有上一步的方式之和:

    上一步上一级台阶,dp[i]+=dp[i-1];

    上一步上两级台阶,dp[i]+=dp[i-2];

    上一步上三级台阶,dp[i]+=dp[i-3];

    综上所述,dp[i]=dp[i-1]+dp[i-2]+dp[i-3];

  3. 初始化

    dp[i]i=0,i=1,i=2的时候没有办法进行推导的,因此我们在填表之前,将1,2,3位置的值初始化

    dp[i]=1,dp[2]=2,dp[3]=4

  4. 填表顺序

    从左往右

  5. 返回值

    应该返回dp[n]的值

    Leetcode刷题详解——三步问题_第1张图片

3.2 C++算法思路:

class Solution {
    const int MOD=1e9+7;
public:
    int waysToStep(int n) {
        if(n==1||n==2) return n;
        if(n==3) return 4;
        //创建dp表
        vectordp(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])%MOD+dp[i-3])%MOD;
        //返回结果
        return dp[n];
    }
};

你可能感兴趣的:(算法,leetcode,算法,职场和发展,动态规划)