爬楼梯问题
来源:互联网 发布:电脑怎么选看淘宝直播 编辑:程序博客网 时间:2024/05/01 05:49
简述:
需要爬N层的楼梯,有max种爬楼梯方式,需要求算总共爬到N层 有几种方法
1. 回溯是比较直观的,就是一层一层向上叠加,走到顶层就是一种方法,得到结果
2. 一维动态规划的话, 就是用一个数组保留走过的楼层,比如最大步伐是3, 然后我现在考虑走到第10层有几种走法
就是 resultArray[10] = resultArray[ 10 - 1] + resultArray[10 - 2] + resultArray[10 - 3] 三者之和
3. 3解法中优化了2中的空间复杂度,用取余的方式实现f(n) = f(n - 1) + f(n - 2) + ... + f(n - k)
例子:
爬4层楼梯 , 则N=4, 有3种步伐,分别为1步,2步,3步
则总共方法7种,一次为
1 + 1 + 1 + 1
1 + 1 + 2
1 + 2 + 1
1 + 3
2 + 1 + 1
2 + 2
3 + 1
算法实现1(回溯法):
使用函数压栈, 不断累加当前楼梯的高度,深度探测是否已经爬到顶了,如果爬到顶了,那么count++,没有那么继续爬,并把步子压到stack中记录步伐顺序
package dynamic_programming;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Stack;public class ClimbTheFloor {private static int count = 0;private static Stack<Integer> stack = new Stack<Integer>();private static ArrayList<String> resultList = new ArrayList<String>();public static void main(String[] args) {InputStream inputStream = System.in; InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferReader = new BufferedReader(inputStreamReader); //Get limited heightSystem.out.print("Please Input the Max height: ");Integer max = null;try{ max = Integer.parseInt(bufferReader.readLine()); }catch(IOException e){ e.printStackTrace(); } //Get the max stepSystem.out.print("Please Input the limited step: ");Integer limit = null; try{ limit = Integer.parseInt(bufferReader.readLine()); }catch(IOException e){e.printStackTrace(); }Climb(0, max, limit);System.out.println("There are " + count + " methods !");for(String record : resultList)System.out.println(record);}public static void Climb(int height, int max, int limit){if(height == max){count++;resultList.add(stack.toString());}else{for(int i = 1;i <= limit; i++)if(height + i <= max){stack.push(i);Climb(height + i, max, limit);stack.pop();}}}}
输出:
2) 动态规划实现:
package dynamic_programming;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class ClimbTheFloor2 {public static void main(String[] args) {InputStream inputStream = System.in; InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferReader = new BufferedReader(inputStreamReader); //Get limited heightSystem.out.print("Please Input the Max height: ");Integer max = null;try{ max = Integer.parseInt(bufferReader.readLine()); }catch(IOException e){ e.printStackTrace(); } //Get the max stepSystem.out.print("Please Input the limited step: ");Integer limit = null; try{ limit = Integer.parseInt(bufferReader.readLine()); }catch(IOException e){e.printStackTrace(); }System.out.println("Number of Methods: " + CountMethods(max, limit));}/* * @ Height : the height of the destination * @ max : the max number of steps you can climb upstairs once */private static int CountMethods(int max, int limit){int resultArray[] = new int[max + 1];resultArray[0] = 1;for(int i = 1;i <= max;i++){int sum = 0;for(int j = 1;j <= limit;j++){if(i - j < 0)break;else{sum += resultArray[i - j];}}resultArray[i] = sum;}return resultArray[max];}}
输出:
3) 优化了2)中的空间复杂度, 将空间降到了O(k) , 其中k为可以走的步数的种类
package dynamic_programming;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class ClimbTheFloor3 {public static void main(String[] args) {InputStream inputStream = System.in;InputStreamReader inputStreamReader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);Integer limit = null;try{System.out.print("Please Input Limited step:");limit = Integer.parseInt(bufferedReader.readLine());}catch(IOException e){e.printStackTrace();}Integer max = null;try{System.out.print("\nPlease Input Max Height: ");max = Integer.parseInt(bufferedReader.readLine());}catch(IOException e){e.printStackTrace();}ClimbTheFloor3 obj = new ClimbTheFloor3();System.out.print("\nMethods: " + obj.CountMethods(max, limit));}private int CountMethods(int max, int limit){if(max < 0 || limit < 0)throw new IllegalArgumentException("Wrong arguments! ");int step[] = new int[limit];for(int i = 0; i < limit; i++)step[i] = 1;for(int i = 1; i <= max; i++){int sum = 0;for(int j = 0; j < limit; j++){if(i - (j + 1) == 0){sum++;break;}sum += step[(i - (j + 1)) % limit];}step[(i - 1) % limit] = sum;}return step[(max - 1) % limit];}}
输出:
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题种种
- 爬楼梯问题
- 爬楼梯问题
- 13爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题
- 爬楼梯问题的解决
- Recursion 爬楼梯问题 @CareerCup
- 回溯解决爬楼梯问题
- fortran子程序声明时直接初始化变量具有save属性
- (1)初识脱壳破解
- 斧劈互联网(一):企业邮箱那点事儿
- (2)认识常用工具
- 数据链路层
- 爬楼梯问题
- 快速把web项目部署到weblogic上
- (3)常用脱壳方法总结
- 最新2012QQ刷钻软件 VB做的,用的是skin.dll皮肤,想要的可下载
- qemu的网卡类型
- 《影响力》读书笔记,第四章 社会认同
- debian6添加了insserv用来代替update-rc.d
- 可视化的数据结构和算法
- 奇偶数分离