————————————

题目:

有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。

比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可以简写成 1,1,1,1,1,1,1,1,1,1。

再比如,每次走2级台阶,一共走5步,这是另一种走法。我们可以简写成 2,2,2,2,2。

当然,除此之外,还有很多很多种走法。

————————————

第一种情况:

第二种情况:

把思路画出来,就是这样子:

F(1) = 1;

F(2) = 2;

F(n) = F(n-1)+F(n-2)(n>=3)

方法一:递归求解

由于代码比较简单,这里就不做过多解释了。

如图所示,相同的颜色代表了方法被传入相同的参数。

方法二:备忘录算法

在以上代码中,集合map是一个备忘录。当每次需要计算F(N)的时候,会首先从map中寻找匹配元素。如果map中存在,就直接返回结果,如果map中不存在,就计算出结果,存入备忘录中。

方法三:动态规划求解

程序从 i=3 开始迭代,一直到 i=n 结束。每一次迭代,都会计算出多一级台阶的走法数量。迭代过程中只需保留两个临时变量a和b,分别代表了上一次和上上次迭代的结果。 为了便于理解,我引入了temp变量。temp代表了当前迭代的结果值。

题目二: 国王和金矿

有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?

方法一:排列组合

每一座金矿都有挖与不挖两种选择,如果有N座金矿,排列组合起来就有2^N种选择。对所有可能性做遍历,排除那些使用工人数超过10的选择,在剩下的选择里找出获得金币数最多的选择。

代码比较简单就不展示了,时间复杂度也很明显,就是O(2^N)。

F(n,w) = 0 (n<=1, w

F(n,w) = g[0] (n==1, w>=p[0]);

F(n,w) = F(n-1,w) (n>1, w

F(n,w) = max(F(n-1,w), F(n-1,w-p[n-1])+g[n-1]) (n>1, w>=p[n-1])

其中第三条是补充上去的,原因不难理解。

方法二:简单递归

把状态转移方程式翻译成递归程序,递归的结束的条件就是方程式当中的边界。因为每个状态有两个最优子结构,所以递归的执行流程类似于一颗高度为N的二叉树。

方法的时间复杂度是O(2^N)。

方法三:备忘录算法

在简单递归的基础上增加一个HashMap备忘录,用来存储中间结果。HashMap的Key是一个包含金矿数N和工人数W的对象,Value是最优选择获得的黄金数。

方法的时间复杂度和空间复杂度相同,都等同于备忘录中不同Key的数量。

方法四:动态规划

方法利用两层迭代,来逐步推导出最终结果。在外层的每一次迭代,也就是对表格每一行的迭代过程中,都会保留上一行的结果数组 preResults,并循环计算当前行的结果数组results。

方法的时间复杂度是 O(n * w),空间复杂度是(w)。需要注意的是,当金矿只有5座的时候,动态规划的性能优势还没有体现出来。当金矿有10座,甚至更多的时候,动态规划就明显具备了优势。

动态规划 漫画 台阶 算法相关推荐

  1. 漫画说算法--动态规划算法二(绝对通俗易懂,非常棒)

    在上一篇漫画中,我们分析了一道动态规划相关的算法问题,并归纳出了问题的状态转移方程式.没看过上一篇的朋友可以点击下面的链接: 漫画说算法–动态规划算法一(绝对通俗易懂,非常棒) 首先,让我们简单回顾一 ...

  2. 漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)

    在前两集漫画中,我们通过一个算法问题的完整解题过程,讲述了动态规划的基本概念和思想.没看过前两集的朋友可以点击下面的链接: 漫画说算法–动态规划算法一(绝对通俗易懂,非常棒) 漫画说算法–动态规划算法 ...

  3. 漫画说算法--动态规划算法一(绝对通俗易懂,非常棒)

    题目: 有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶.要求用程序来求出一共有多少种走法. 比如,每次走1级台阶,一共走10步,这是其中一种走法.我们可以简写成 1,1,1 ...

  4. 【Java数据结构与算法】第十八章 动态规划和KMP算法

    第十八章 动态规划和KMP算法 文章目录 第十八章 动态规划和KMP算法 一.动态规划 1.介绍 1.爬楼问题 2.扔鸡蛋问题 3.背包问题 二.KMP算法 1.引入 2.介绍 2.代码实现 一.动态 ...

  5. 分治法、动态规划、贪心算法区别

    联系 分治.动态规划.贪心算法都是把一个大的问题给分解成子问题,通过解决子问题来最终解决原问题的. 区别 分治: 子问题不重复时候更适合,重复也能用,效率低,最好动态规划. 动态规划: 重复的公共子问 ...

  6. JavaScript实现递归楼梯问题(动态规划解决方案)算法(附完整源码)

    JavaScript实现递归楼梯问题(动态规划解决方案)算法(附完整源码) recursiveStaircaseDP.js完整源代码 recursiveStaircaseDP.test.js完整源代码 ...

  7. JavaScript实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码)

    JavaScript实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码) dpMaximumSubarray.js完整源代码 dpMaximumSubarray.test ...

  8. 53. 最大子序和 golang (动态规划与贪心算法)

    题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续 ...

  9. 活动安排问题的 动态规划和贪心算法

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

最新文章

  1. 属性 visibility
  2. 五、springcloud之客户端负载均衡Ribbon
  3. 【 FPGA 】FIR 滤波器之半带插值器(Half-band Interpolator)
  4. 参会全攻略 | 倒计时 7 天!30+ 位重量级嘉宾“聊”什么?
  5. 08年最热门七大技术和最紧缺的IT人才
  6. 收藏!企业数据安全防护5条建议
  7. 因kuaipan等PPA造成的Duplicate sources.list entry 错误
  8. Ant—如何Windows操作系统中搭建Apache Ant环境
  9. javascript--一个简洁的管理菜单
  10. Excel常用统计分析函数分享
  11. 捷联惯导系统模型及仿真(二)
  12. 学习Java必看的Java书籍(本本经典实用)
  13. 学术会议演讲视频录制全方位指南
  14. 正则验证手机号码和邮箱格式
  15. mysql计算同比和环比的区别_Mysql同比环比统计
  16. 谷歌图片的爬虫库(附加必应图片爬虫)--针对近期谷歌变了
  17. java实现斜水印铺满整张图
  18. adb shell input(系统服务:input)
  19. 指南Java面试常问问题及答案
  20. JUC多线程并发编程

热门文章

  1. 无聊消遣——基于pygame库的飞机大战
  2. 基本使用-ElasticSearch
  3. Z3Gateway 子 Makefile
  4. 软考中级软件评测师,你真的了解它吗?
  5. 推荐 :一个好的事件跟踪字典是什么样的?
  6. 中餐馆过程vs中餐馆特许经营
  7. 30岁之前需要做的事
  8. H323和华为协商的问题
  9. 【亲测有用,详解】 Windows系统 Vim 安装 Vundle之后,出现 E492:PluginInstall 不是编辑器命令的解决方法,
  10. mysql全文本搜索