这题先用回溯实现了一遍,但是效率太低没有AC,然后重新把他理解为Fibonacci数,做递归就好了,效率还凑合
把代码都贴在下面,如果不能理解回溯的朋友,可以看我上一篇的八皇后
假设你现在正在爬楼梯,楼梯有n级。每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部?
格式:
第一行输入一个数n,代表楼梯的级数。
接下来一行输出你的方法总数。
样例输入
5
样例输出
8
//******回溯实现******
import java.security.AllPermission;
import java.util.Scanner;
import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;
public class Main {
public static int num; //最终台阶数
private static int[] step = new int [10000];//具体每一步的台阶数
private static long sum =0; //总共多少种情况
public static int all(int n){//求一共走了多少台阶
int All=0;
for(int i=0;i<n+1;i++)
All+=step[i];
return All;
}
public static void next(int N){//递归求复合条件的解
int n;
for(int i=1;i<=2;i++){//一步两步 一步两步
step[N] = i;
if(all(N)==num)//台阶数满足,总和加1
sum++;
else if(all(N)<num)//不够总台阶数,再走下一步
next(N+1);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
num = in.nextInt();
next(0);
System.out.println(sum);
}
}
</pre><pre name="code" class="java">//*****普通递归实现*****
import java.security.AllPermission;
import java.util.Scanner;
public class Main {
private static int[] all = new int[1000];
public static int step(int n){
int sum=0;
if(all[n]>0)
return all[n];
if(n==0||n==1)
return 1;
else
sum=step(n-1)+step(n-2);
all[n]=sum;
return sum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(step(n));
}
}