最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划。提起动态规划就不得不提几个动态规划的金典问题爬楼梯、国王金矿、背包问题。今天就仔细分析一下爬楼梯问题。

列子 问:有一个高度为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(intn){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, Mapmap){if ( n<1 ) return 0;if (n == 1)return 1;if (n == 2)return 2;if(map.containsKey(n)){returnmap.get(n);

}else{int val = getClimblingWaysWithCache(n-1,map)+getClimblingWaysWithCache(n-2,map);

map.put(n,val);returnval;

}

}

这种算法大大减少时间复杂度,其时间复杂发度和空间复杂度都为O(n)

到这里为止我们并未结束 我们要开始转为一下思维我们不用自顶向下的方法转化为自底向上的方法,如图所示:

在台阶大于3以后 每一个台阶的走法数之和前两个台阶数有关所有我们在可以优化一种新的方法并不不需要记住每一个子集的解,只需要记住前面两个方法的解就好,因此我们引入了第三种方法

方法三、动态规划解法

public int getClimblingWays3(intn ){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;

}returntemp;

}

程序从i=3开始到i=n结束 即只有F(n)n>=3的时候才开始进入循环。好了到此为止最简单的动态规划问题就全部梳理好了。

java 爬楼梯算法_动态规划-爬楼梯问题java实现相关推荐

  1. java实现背包问题例子_动态规划(背包问题)java实现

    背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问题的名 ...

  2. java 图像刺绣算法_图像处理:OpenCV3源代码文件解析

    引言 结合冈萨雷斯的<数字图像处理>和Opencv3.0,学习图像处理算法有一段时间了,知道了函数怎么使用,但不知道opencv所用的函数源代码是如何编写的,"知其然,也要知其所 ...

  3. java 哈希算法_选择Java密码算法第1部分-哈希

    java 哈希算法 抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥 ...

  4. 6种java垃圾回收算法_被说烂了的Java垃圾回收算法,我带来了最“清新脱俗”的详细图解...

    一.概况 理解Java虚拟机垃圾回收机制的底层原理,是系统调优与线上问题排查的基础,也是一个高级Java程序员的基本功,本文就针对Java垃圾回收这一主题做一些整理与记录.Java垃圾回收器的种类繁多 ...

  5. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  6. python爬取晋江_爬虫爬取晋江文学网总分榜(失败)

    一.目的 : 爬取晋江文学网总分榜 二.python爬取数据 三.爬取 在开始多出现了38号而且顺序内容不准确 代码: import requests from bs4 import Beautifu ...

  7. java 鸢尾花分类算法_鸢尾花分类算法实现 java

    使用的贝叶斯分类算法实现的,编程语言为java.是我本学期修的数据库与数据挖掘的课程的期末课程作业,算法本身不难,思路理清楚了很简单. 先看看鸢尾花(Iris)数据集(下图为数据集的部分截图),鸢尾花 ...

  8. python爬取晋江_爬虫爬取晋江文学网总分榜

    一.目的 : 爬取晋江文学网总分榜 二.python爬取数据 三.爬取 在开始多出现了38号而且顺序内容不准确 代码: import requests from bs4 import Beautifu ...

  9. 我的世界java版合成表_我的世界:Java版和基岩版的5个合成表差异,知道半数,老MC无疑。...

    "不要在云了,你这个云玩家!"不知道你没有没有因为某些原因被网友说成是MC的云玩家,我就听到过一个很冤枉的故事.一个已经玩了5年之久的基岩版玩家,被一个玩了一年Java版的玩家硬生 ...

最新文章

  1. 百度paddle学习笔记
  2. RocketMQ 基本概念
  3. matlab多边形扫描线填充算法代码,计算机图形学—多边形扫描与填充
  4. requests.exceptions.ConnectionError: (‘Connection aborted.‘, BadStatusLine(“‘‘“,))
  5. 链表中是否存在环的问题,及环入口在链表中位置(Linked List Cycle II)
  6. WireShark之抓包过滤链接部分
  7. 如何给微软提反馈建议以及bug
  8. 【转】为什么博士叫PhD?
  9. html图片从中间淡入淡出效果,CSS中的多个图像交叉淡入淡出-无需(java)脚本
  10. mac地址修改_【电脑知识】在纯DOS下更改BIOS中网卡MAC地址教程
  11. 剑指Offer之寻找链表中环的入口问题
  12. 使用Golang实现的快速排序
  13. Ubuntu安装Apache+PHP
  14. python的notebook怎么用_如何通过命令行将IPython Notebook转换为Python文件?
  15. 千亿数仓第四章(指标计算_订单分析地域、分类维度分析业务开发)
  16. 广州大学人工智能原理实验二:八数码问题
  17. c语言求5个整数最小公倍数,C语言求两个正整数的最小公倍数和最大公约数
  18. java jar apktool,apktool下载
  19. 瞎聊高速公路与主干道的立交匝道设计
  20. c语言贺卡代码大全,C++实现新年贺卡程序

热门文章

  1. 计算机休眠会断电吗,电脑休眠后到底可不可以切断电源!!是还是不是啊??
  2. Java入门123:一个老鸟的Java学习心得(二维码版)
  3. Android AccountManager帐号管理(一)
  4. 最高级微型计算机,「简讯」曜越发布CPU、内存一体式水冷;realme X50t曝光……...
  5. 向程序发送命令时出现错误
  6. 【Lawin Transformer2022】Lawin Transformer: Improving Semantic Segmentation Transformer with Multi-Sc
  7. IIS6 + Resin3.1.x 的不爽之处
  8. ffmpeg交叉编译指南
  9. apiCloud授权绑定第三方账号,微信、QQ、微博。
  10. VS源文件提取工具vsjuicer 实现细节