题目要求
一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法。
import java.util.Scanner;
public class Climb {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int length = sc.nextInt();
int[] a = new int[length];
for (int i = 0; i < length; i++) {
a[i]= sc.nextInt();
}
for (int i = 0; i < a.length; i++) {
if(a[i]==1) {
System.out.println(0);
continue;
}
System.out.println(solution2(a[i]));
}
}
//解法一:递归,核心思想:f(m)=f(m-1)+f(m-2),优点:好理解,缺点:时间效率和空间效率不高
public static int solution1(int m) {
if(m==1)
return 1;
if(m==2)
return 1;
else
return solution1(m-1)+solution1(m-2);
}
//解法二:使用memo数组记录已经算过的值;
public static int[] memo;
public static int solution2(int m) {
memo = new int[m+1];
if(m==2)
return 1;
return useMemo(m);
}
private static int useMemo(int m) {
memo[1]=1;
memo[2]=2;
if(memo[m]!=0)
return memo[m];
else
return memo[m-1]+memo[m-2];
}
//解法三:使用动态规划,从小到大循环;
public static int solution3(int m) {
int[] res = new int[m+1];
res[1]=1;
res[2]=1;
for (int i = 3; i <= m; i++) {
res[i]=res[i-1]+res[i-2];
}
return res[m];
}
}
ps:楼主第一次写博客,请大家多多支持哈