爬楼梯问题(递归+动态规划)

我也是听别人说的这个问题 题目有点记不清了

大概意思:有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 用到你内存爆炸位置!哈哈
如果各位有什么更加优化的办法欢迎提出来

    原文作者:动态规划
    原文地址: https://blog.csdn.net/a1455990364/article/details/76584870
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞