我也是听别人说的这个问题 题目有点记不清了
大概意思:有N个台阶,可以一次上1介,也可以一次上两阶,问有多少中方法可以爬上顶。
数据规模约束:N<=30,N>=1
如果这题没有数据规模约束,那么不要用递归做,时间上等不起。
分析一下:1级台阶只有一种方法 一次跨1级,2级台阶有2种方法,可以一次跨2阶,也可以分两次跨1阶,3级台阶1 1 1,1 2,2 1,3中方法……..,4级台阶5种,5级8种,明显就是一个兔子繁殖的问题(又称斐波那契数列),,,,,直接用递归就行了
import java.util.Scanner;
public class T8 {
static int N;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
N=scanner.nextInt();
System.out.println(fun(N));
}
private static long fun(int n) {
// TODO Auto-generated method stub
if(n==1){ //一级台阶只有1种方法
return 1;
}
else if(n==2)//二级台阶2种,其实可以省略的 不过为了初学者能够看清楚 我这里写出来
return 2;
return fun(n-1)+fun(n-2);
}
}
因为这里数据约束最多30 也就几亿的数据,基本可以秒出结果,如果数据规模大,可以考虑DP。
DP解决 无惧数据规模,
动态规划原理这里我就不说了,斐波那契数列数列的规律我也不说了,相信大家都应该明白。。。如果不明白证明递归没学好,动态规划的话…我还不是很熟练这里就不弄斧了
import java.util.Scanner;
public class T8 {
static int N;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
N=scanner.nextInt();
long []dp=new long[N+1];
dp[0]=1;
dp[1]=1;
for (int i = 2; i <= N; i++) {
dp[i]=dp[i-1]+dp[i-2];
}
System.out.println(dp[N]);
}
}
只要不超过long的数据范围,如果你想真正的无惧规模,那可以用BigInteger 用到你内存爆炸位置!哈哈
如果各位有什么更加优化的办法欢迎提出来