面试题 08.01. 三步问题 - 力扣(LeetCode)
思路
0表示小孩站的位置,1表示第一个台阶,
小孩从0跳到1有多少种跳法,1种吧。
小孩要跳到第二个台阶有几种跳法?
是不是可以选择从0直接跳到2,或者从1跳到2.
从0直接跳到2是一种方法,从1跳到2需要先从0跳到1,也就是下图这种表示关系:
那小孩现在要跳到第三个台阶呢?
首先我们知道从0到3是一种 从2到3是一种,从2到3必定经过了从0到1,从1到2,所以从1到3就不必算了。 如下图:
所以到3一共有2+1+1+1=4种
到第四个台阶有多少种方法呢? 同样,只用算从0到4和从3到4就可以了:
初始化
我们将才这一张图不是算出来了前面三个台阶有几种方法吗:
我们可以初始化一下这三个台阶,后面台阶求法就可以借助这三个台阶去求:
dp[1]=1,dp[2]==2 dp[3]=4
顺序
我们要求第五个台阶必须要先求前面的
返回值
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];
}
};