有一楼梯共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();
    }
}