有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法? 注:规定从一级到一级有0种走法。
2017-11-28 17:44
1021 查看
解:这道题我的初始思路走法必定有111...,还有一种就是里面还有二的序列,这是一个排列组合问题。可是太暴力了,时间复杂度是指数倍。
看了一下题解就是要用动态规划来求解。
进阶1:
我们走的最后一步,有几种可能。就是两种,一种是走一步,一种是走两步。拿我们走到十台阶的可能数就可以分为两类F(8)和F(9)。那么我们F(10)=F(9)+F(8),
边界时F(1)=0,F(2)=1
进阶2:
同理F(9)=F(8)+F(7)............. 状态转移方程就是F(n)=F(n-2)+F(n-1)
进阶3
方程求解,第一是想到递归。可是递归的时间复杂度太大,
复杂度是二叉树,树每层有2的n-1次方个节点,总共的节点就是Sn=1+2^1+2^2.......+2^(n-1),2Sn=2^1+2^2.......+2^n,错位相肖法的Sn=2^n-1,时间复杂度就是O(2^N).
进阶4:
二叉树里面有一些重复的元素,也就是重复计算的元素,所以我们可以创建一个哈希表,把不同参数的结果存入哈希表,遇到相同参数就从哈希表里面取出,不相同就继续计算。这种方法叫备忘录算法
将它实现一下就是
public class Main { static int getLevelNumber(int n,HashMap<Integer,Integer> map) { if (n <= 1) { return 0; } if (n == 2) { return 1; } if (n == 3) { return 2; } if (map.containsValue(n)){ return map.get(n); } else{ int value=getLevelNumber(n-1,map)+getLevelNumber(n-2,map); map.put(n,value); return value; } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int b = sc.nextInt(); int a[] = new int[b]; for (int i = 0; i < b; i++) { a[i] = sc.nextInt(); }
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>(); for (int i = 0; i < b; i++) { System.out.println(getLevelNumber(a[i],map)); } }}
进阶5;
我们还可以进一步优化,不妨换个角度,以前是自顶往下的算法,我们换成自下往上的算法。我们已知了F(1)=0,F(2)=1,F(3)=2.我们可以发现从第三解体开始,后面的都是前面两个的和。F(4)=F(3)+F(2).......
也是一个二叉树的形式,我们就可以通过一个for循环,然后不断替换彼此的身份即可。
public class Main { static int getLevelNumber(int n){ if(n<1){ return 0; } if(n==1){ return 0; } if(n==2){ return 1; } if(n==3){ return 2; } int temp=0; int a=0; int b=1; for(int i=3;i<=n;i++){ temp=a+b; a=b; b=temp; } return temp; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int b = sc.nextInt(); int a[] = new int[b]; for (int i = 0; i < b; i++) { a[i] = sc.nextInt(); } for (int i = 0; i < b; i++) { System.out.println(getLevelNumber(a[i])); } } }
相关文章推荐
- 描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法? 注:规定从一级到一级有0种走法。
- 超级台阶 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法? 注:规定从一级到一
- 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?请编程实现。
- 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?
- (hdu step 3.1.1)超级楼梯(简单递推:从第1级到第m级有多少种走法,每次只能走一步或两步)
- java__假设你现在正在爬楼梯,楼梯有 nn 级。每次你只能爬 11 级或者 22 级,那么你有多少种方法爬到楼梯的顶部
- 小明有5本新书,要借给A、B、C三位小朋友,若每人每次只能借一本, 共有多少种借书的方案?
- java:递归:上楼梯每次只能一步或者两步,有多少走法
- 有1000阶的台阶,一个人每次只能走一阶或两阶,用一个递归算法求出共有多少种走法。
- 一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式
- 有1000阶的台阶,一个人每次只能走一阶或两阶,用一个递归算法求出共有多少种走法。
- (斐波那契数列应用)一只青蛙一次可以跳上一级台阶 也可以跳上二级 求该青蛙跳上一个n级的台阶 总共有多少种跳法
- 1001个球,两个人轮流拿球,且每次只能拿1、2、4个球,规定拿到最后一个球的人为输。如果让你先拿,你是否有必胜的把握。如果有,该如何操作?
- 楼梯有n阶台阶,上楼可以一步上1阶,2阶,3阶,编程序计算共有多少种不同的走法?
- 一个人走一个n阶的楼梯,他一步可以走1阶,2阶,3阶,这三种情况,问走完这n阶的楼梯共有多少种不同的走法?
- 某种传染病第一天只有一个患者,前五天为潜伏期,不发作也不会传染人 第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人 求第N天共有多少患者
- 五子棋(右)从给定点开始向上共有多少个连续的相同颜色的子?
- 10个台阶,每次只能上1个或者2个,一共有多少种走法
- 算法-有n步台阶,一次只能上1步或2步,共有多少种走法
- 一共有20级楼梯,每次可以上1级或2级,登上第20级一共有多少种上法