面试题 08.01. 三步问题
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
提示:
n范围在[1, 1000000]之间
1.纯动态规划
int waysToStep(int n){
int dp[n];
if(n==1)
return 1;
if(n==2)
return 2;
dp[0]=1;
dp[1]=2;
dp[2]=4;
for(int i=3;i<n;i++)
{
dp[i]=(((dp[i-1]+dp[i-2])%1000000007+dp[i-3])%1000000007);
}//注意取余的概念,如果被除数不大于除数的情况下对它的除数取余是不变的。
return dp[n-1];
}
2.动态规划加滚动数组
定义三个状态即可
int waysToStep(int n){
int first,second,third;
if(n==1)
return 1;
if(n==2)
return 2;
first=1;
second=2;
third=4;
for(int i=3;i<n;i++)
{
int temp=third;//其为局部变量即可,因为它只是在循环体中才会用到
third=((first+second)%1000000007+third)%1000000007;//对third取余,则first,second也会自动取余了
first=second;
second=temp;
}
return third;
}