有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法。
给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100。为了防止溢出,请返回结果Mod 1000000007的值。
测试样例:
3
返回:2
}
既然你们都用了动态规划,那我分享一个能跑的递归算法
import java.util.*;
public class GoUpstairs {
static int[] num = new int[100];
public static int countWays(int n) {
if(n == 0){
return 0;
}
if(n == 1){
return 0;
}
if(n == 2){
return 1;
}
if(n == 3){
return 2;
}
if(num[n-1] != 0){
return num[n-1];
}
num[n-1] = (countWays(n-1)+countWays(n-2))%1000000007;
return num[n-1];
}
}
import java.util.*;
public class GoUpstairs {
public int countWays(int n) {
// write code here
int a=1;
int b=2;
int s=0;
if(n<=3)
return n-1;
else{
for(int i=4;i<=n;i++){
s=(a+b)%1000000007;
a=b;
b=s;
}
return s;
}
}
}
//个人觉得应该在最终的结果上Mod,不应该每做一步就Mod,你们觉得呢?
import java.util.*;
public class GoUpstairs {
public int countWays(int n) {
// write code here
//dp[i]=dp[i-1]+dp[i-2]
long[] dp = new long[n+1];
dp[0]=0;
dp[1]=0;
dp[2]=1;
dp[3]=2;
int Mod=1000000007;
for(int i=4;i<=n;i++){
dp[i]=(dp[i-1]+dp[i-2])%Mod; //dp[i]=dp[i-1]+dp[i-2]
}
return (int)dp[n]; //个人觉得应该是这样才对(int)(dp[n]%Mod)
}
}
//斐波那契 非递归
import java.util.*;
public class GoUpstairs {
public int countWays(int n) {
int res=0;
if(n==1) res=0;
if(n==2) res=1;
if(n==3) res=2;
int p=1,q=2;
for(int i=4;i<=n;i++){
res=(p+q)%1000000007;
p=q;
q=res;
}
return res;
}
}
一开始考虑用long型结果溢出了,后来想到Thinking in java 还是哪本书提到过BigDecimal,果然适用于无敌大的数啊。
import java.util.*;
import java.math.BigDecimal;
public class GoUpstairs {
public int countWays(int n) {
// write code here
// write code here
BigDecimal firstPrev ;
BigDecimal secondPrev ;
if(n ==1) return 0;
if(n ==2) return 1;
secondPrev =new BigDecimal(1);
if(n == 3) return 2;
firstPrev = new BigDecimal(2);
BigDecimal result = new BigDecimal(0);
for(int i=4; i<= n ;i++){
result = firstPrev.add(secondPrev);
secondPrev = firstPrev;
firstPrev = result;
}
BigDecimal last = result.remainder(new BigDecimal(1000000007));
return last.intValue();
}
}