动态规划-爬楼梯问题java实现
最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划。提起动态规划就不得不提几个动态规划的金典问题爬楼梯、国王金矿、背包问题。今天就仔细分析一下爬楼梯问题。
列子 问:有一个高度为10级台阶的楼梯,从下往上走,每一次向上跨一个台阶只能是一个台阶或者两个台阶,要求用程序求出来一共有多少种算法?
思考:如果每次都跨一个台阶 则为 1+1+1+1+1+1+1+1+1+1这种方式 、如果每次都跨两个台阶则为2+2+2+2+2+2......很多很多种,最简单暴力的算法就是写个多种循环递归调用输出所有的可行的方法,但是这种方法时效率最低的时间复杂度成指数形式递增。现在我们就开始考虑用动态规划的思路来思考这个问题,动态规划的思路就是将问题拆分、分治。
首先将问题先考虑爬楼梯的问题执行到最后一步了,只差一步就可以结束这个请款下的问题,在这个时候只有两种可能了一、从第9阶楼梯跨一步到达10阶和从第8阶一次性跨两个台阶到达10阶。假设到达第9阶台阶的方法为a种,到达第8阶的方法为b种 则到达第10阶的方法则为a+b,ok这个时候我们简写 到10阶台阶的方法为F(10),则F(10) = F(9)+F(8),然后同理继续拆分 F(9)=F(8)+F(7),F(8)=F(7)+F(6),拆分到最后当台阶只剩下1阶和二阶的时候很容易得到一个常量 F(1)=1,F(2)=2,由此可得一个公式:
F(n) = F(n-1)+F(n-2) (n>=3)
这个时候我们就得到了用到了动态规划的的概念 F(9)和F(8)是F(10)的最优子结构,F(1)=1,F(2)=2就是动态规划所谓的问题的边界,而上面所得到的公式就是状态转移方程,好了到现在为止 已近理清了我们的思路现在就要开始考虑如何解问题了,代码采用java编写
方法一、
public int getClimblingWays(int n){
if ( n<1 ) return 0;
if (n == 1)return 1;
if (n == 2)return 2;
return getClimblingWays(n-1)+getClimblingWays(n-2);
}
当然这个方法可以解决这个问题但是我们也要考虑 这个是不是运行了是很重复的计算,下面是一张所有计算节点的图
这个算法的时间复杂度是一个是一个二叉树,每一个节点都去过去进行计算即使已经计算过了 ,我们可不可以做个缓存记住已近计算好的结果呢?这里我们就引出了第二种方法
方法二、备忘录算法
public int getClimblingWaysWithCache(int n, Map<Integer,Integer> map){
if ( n<1 ) return 0;
if (n == 1)return 1;
if (n == 2)return 2;
if (map.containsKey(n)){
return map.get(n);
}else{
int val = getClimblingWaysWithCache(n-1,map)+getClimblingWaysWithCache(n-2,map);
map.put(n,val);
return val;
}
}
这种算法大大减少时间复杂度,其时间复杂发度和空间复杂度都为O(n)
到这里为止我们并未结束 我们要开始转为一下思维我们不用自顶向下的方法转化为自底向上的方法,如图所示:

在台阶大于3以后 每一个台阶的走法数之和前两个台阶数有关所有我们在可以优化一种新的方法并不不需要记住每一个子集的解,只需要记住前面两个方法的解就好,因此我们引入了第三种方法
方法三、动态规划解法
public int getClimblingWays3(int n ){
if ( n<1 ) return 0;
if (n == 1)return 1;
if (n == 2)return 2;
int a = 1;
int b = 2;
int temp =0;
for(int i = 3;i <= n ;i++){
temp = b + a;
a = b;
b = temp;
}
return temp;
}
程序从i=3开始到i=n结束 即只有F(n)n>=3的时候才开始进入循环。好了到此为止最简单的动态规划问题就全部梳理好了。
动态规划-爬楼梯问题java实现的更多相关文章
- climbing stairs(爬楼梯)(动态规划)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- 【leetcode70】【动态规划】 爬楼梯
(1 pass 一维动态规划) 爬楼梯(easy) 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数 ...
- Climbing Stairs爬楼梯——动态规划
题目描写叙述: 初阶:有n层的台阶,一開始你站在第0层,每次能够爬两层或者一层. 请问爬到第n层有多少种不同的方法? 进阶:假设每次能够爬两层.和倒退一层,同一个位置不能反复走,请问爬到第n层有多少种 ...
- LeetCode初级算法--动态规划01:爬楼梯
LeetCode初级算法--动态规划01:爬楼梯 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
- Leetcode题目70.爬楼梯(动态规划+递归-简单)
题目描述: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 ...
- Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs)
Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost ...
- Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
746. 使用最小花费爬楼梯 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi. 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶 ...
- Java实现 LeetCode70 爬楼梯
70. 爬楼梯 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: ...
- lintcode: 爬楼梯
题目: 爬楼梯 假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 样例 比如n=3,中不同的方法 返回 3 解题: 动态规划题目,同时还是有顺序 ...
随机推荐
- Mysql 函数定义及批量数据脚本
零.说在前面 在定义函数之前 需要先将 log_bin_trust_function_creators 值设为开启,原因如下 在主从复制的两台Mysql服务器中,slaver会从master复制数据, ...
- nmonchart 分析.nmon监控数据成html展示
下载地址:http://nmon.sourceforge.net/pmwiki.php?n=Site.Nmonchart chart安装包:http://sourceforge.net/project ...
- form中把图片设为按钮
提交按钮sumbit <input type="image" src="图片路径">//type="image"默认是sumbi ...
- mysql的数据库开放权限
链接数据库之后运行下面的命令即可 grant all PRIVILEGES on *.* to %username%@'%' identified by '%password%'; 如给root链接数 ...
- python开发基础02-字符串操作方法练习题
1.执行 Python 脚本的两种方式 python解释器 py文件 #!/usr/bin/env python 进入python解释器,便捷命令并执行 pycharm或其他pythonIDE sh ...
- [python] VSCode+Jupyter 安装步骤以及注意事项
1. 安装Python2. 安装Jupyter, pip install 安装Jupyter(若使用Anaconda,则需要将其添加到环境变量中)3. 将Python的Scripts文件夹添加到系统环 ...
- Atcoder Beginner Contest151D(迷宫问题求任意两点最短路径的最大值,BFS)
BFS可以求得最短路,DFS会找到从当前点到图中叶子结点的路径. #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using na ...
- 每天进步一点点------入门视频采集与处理(BT656简介)
凡是做模拟信号采集的,很少不涉及BT.656标准的,因为常见的模拟视频信号采集芯片都支持输出BT.656的数字信号,那么,BT.656到底是何种格式呢? 本文将主要介绍 标准的 8bit B ...
- Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等
从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...
- 在 input 上添加图标字体时无法添加的问题
效果:一个搜索框.如图: 实施过程:一开始,将搜索框分为2部分,用2个 input ,一个 search ,一个 button ,然后给 type="button" 的input ...