面试题 08.01. 三步问题

69 阅读1分钟

面试题 08.01. 三步问题 - 力扣(LeetCode)

思路

0表示小孩站的位置,1表示第一个台阶, image.png

小孩从0跳到1有多少种跳法,1种吧。

image.png 小孩要跳到第二个台阶有几种跳法? image.png 是不是可以选择从0直接跳到2,或者从1跳到2. 从0直接跳到2是一种方法,从1跳到2需要先从0跳到1,也就是下图这种表示关系:

image.png

那小孩现在要跳到第三个台阶呢?

首先我们知道从0到3是一种 从2到3是一种,从2到3必定经过了从0到1,从1到2,所以从1到3就不必算了。 如下图:

image.png

所以到3一共有2+1+1+1=4种

到第四个台阶有多少种方法呢? 同样,只用算从0到4和从3到4就可以了:

image.png

初始化

我们将才这一张图不是算出来了前面三个台阶有几种方法吗:

image.png 我们可以初始化一下这三个台阶,后面台阶求法就可以借助这三个台阶去求:

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

顺序

image.png

我们要求第五个台阶必须要先求前面的

返回值

dp[n]

code

class Solution {
public:
    int waysToStep(int n) {
        //1.dp表
     //2.初始化
     //3.填表
     //4.返回值
   const int MOD=1e9+7;

     vector<int> dp(n+1);


     //边界问题
     if(n==1) return 1;
     if(n==2) return 2;
     if(n==3) return 4;

     //2.
     dp[1]=1,dp[2]=2,dp[3]=4;


     //3.
     for(int i=4;i<=n;i++)
     {
         dp[i]=((dp[i-1]+dp[i-2])%MOD+dp[i-3])%MOD;
     }

     return  dp[n];
    }
};