三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
有一说一,这就是青蛙跳台阶问题,我开始写的代码如下
class Solution {
public:
int waysToStep(int n) {
int sum = 0;
dfs(n,sum);
return sum%1000000007;
}
//需要进行剪枝操作
void dfs(int n,int &sum){
if(n == 0){
sum++;
return ;
}
if(n< 0)
return;
if(n>0){
dfs(n-1,sum);
dfs(n-2,sum);
dfs(n-3,sum);
}
}
};
有一个很大的问题是效率太低,,因该考虑剪枝或者把之前的数据存起来。
最后有了这个融合怪
class Solution {
public:
int waysToStep(int n) {
vector<long int> dp(n,0);
if(n == 1)
return 1;
if(n == 2)
return 2;
if(n == 3)
return 4;
dp[0] = 1;
dp[1] =2;
dp[2] = 4;
if(n >3){
for(int i=3;i<n;i++)
{
dp[i] = (dp[i-1]+dp[i-2]+dp[i-3])%1000000007;
} }
return dp[n-1];
}