漫画:什么是动态规划?(整合版)

题目:

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

比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可以简写成 1,1,1,1,1,1,1,1,1,1。
漫画:什么是动态规划?(整合版)_第1张图片

解法1:暴力枚举法(利用排列组合思想,写一个多层嵌套循环遍历出所有的可能性。每遍历出一个组合,让计数器加一)
漫画:什么是动态规划?(整合版)_第2张图片
大事化小,小事化了
那刚才的面试题目来说,假设只差最后一步就走到第10级台阶,这时候会出现几种情况?
漫画:什么是动态规划?(整合版)_第3张图片
漫画:什么是动态规划?(整合版)_第4张图片
漫画:什么是动态规划?(整合版)_第5张图片
思路如下
漫画:什么是动态规划?(整合版)_第6张图片
F(10) = F(9) + F(8)
漫画:什么是动态规划?(整合版)_第7张图片
动态规划当中包含三个重要的概念:最优子结构,边界,状态转换公式
漫画:什么是动态规划?(整合版)_第8张图片
漫画:什么是动态规划?(整合版)_第9张图片
漫画:什么是动态规划?(整合版)_第10张图片
动态规划两个部分:1问题建模,2解决问题
漫画:什么是动态规划?(整合版)_第11张图片
漫画:什么是动态规划?(整合版)_第12张图片
漫画:什么是动态规划?(整合版)_第13张图片
漫画:什么是动态规划?(整合版)_第14张图片
漫画:什么是动态规划?(整合版)_第15张图片
漫画:什么是动态规划?(整合版)_第16张图片
漫画:什么是动态规划?(整合版)_第17张图片
备忘录算法{}
漫画:什么是动态规划?(整合版)_第18张图片
漫画:什么是动态规划?(整合版)_第19张图片
程序从 i=3 开始迭代,一直到 i=n 结束。每一次迭代,都会计算出多一级台阶的走法数量。迭代过程中只需保留两个临时变量a和b,分别代表了上一次和上上次迭代的结果。 为了便于理解,我引入了temp变量。temp代表了当前迭代的结果值。
题目二: 国王和金矿

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

漫画:什么是动态规划?(整合版)_第20张图片
方法一:排列组合

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

代码比较简单就不展示了,时间复杂度也很明显,就是O(2^N)。
漫画:什么是动态规划?(整合版)_第21张图片
漫画:什么是动态规划?(整合版)_第22张图片
漫画:什么是动态规划?(整合版)_第23张图片
第一步:找出最优子结构
漫画:什么是动态规划?(整合版)_第24张图片
漫画:什么是动态规划?(整合版)_第25张图片
漫画:什么是动态规划?(整合版)_第26张图片
F(5,10) = MAX( F(4,10) , F(4, 10 - P(4) ) +G【4】 )
第二步:找出最优选择之间的关系
漫画:什么是动态规划?(整合版)_第27张图片
第三步:确定问题的边界
漫画:什么是动态规划?(整合版)_第28张图片
漫画:什么是动态规划?(整合版)_第29张图片
方法二:简单递归

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

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

方法三:备忘录算法

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

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

漫画:什么是动态规划?(整合版)_第30张图片

转自http://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653190796&idx=1&sn=2bf42e5783f3efd03bfb0ecd3cbbc380&chksm=8c990856bbee8140055c3429f59c8f46dc05be20b859f00fe8168efe1e6a954fdc5cfc7246b0&scene=21#wechat_redirect

你可能感兴趣的:(递归算法设计,算法)