题目描述
-
有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
-
示例1:
输入:n = 3
输出:4
说明: 有四种走法 -
示例2:
输入:n = 5
输出:13
提示: -
n范围在[1, 1000000]之间
解析
- (递归解法)最优子问题:上一阶楼梯、上二阶楼梯、上三节楼梯,可以理解成,先上一阶楼梯+剩下的楼梯数对应的走法+先上二阶楼梯+剩下楼梯数对应的走法+先上三阶楼梯+剩余楼梯数对应的走法
- (dp解法)
代码
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
long solve = solve2(n);
System.out.println(solve);
}
//大数据是会出现栈溢出
private static long solve(int n) {
if(n==1) return 1;
if(n==2) return 2;
if(n==3) return 4;
//在n-1处往上迈1步 在n-2处往上迈2步 在n-3处往上迈3步
return solve(n-1)+solve(n-2)+solve(n-3)%1000000007;
}
private static long solve2(int n) {
if(n==1) return 1;
if(n==2) return 2;
if(n==3) return 4;
//在n-1处往上迈1步 在n-2处往上迈2步 在n-3处往上迈3步
int x1=1,x2=2,x3=4;
for (int i = 0; i < n-3; i++) {
int t=x1;
x1=x2;
x2=x3;
x3=(x1+x2+t)%1000000007;
}
return x3;
}