漫画 | 趣谈:什么是动态规划?

转载

腾讯课堂

百家号 06-20 10:39
漫画 | 趣谈:什么是动态规划?_第1张图片
漫画 | 趣谈:什么是动态规划?_第2张图片
漫画 | 趣谈:什么是动态规划?_第3张图片
漫画 | 趣谈:什么是动态规划?_第4张图片

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

漫画 | 趣谈:什么是动态规划?_第5张图片
漫画 | 趣谈:什么是动态规划?_第6张图片
漫画 | 趣谈:什么是动态规划?_第7张图片

题目:

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

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

漫画 | 趣谈:什么是动态规划?_第8张图片

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

漫画 | 趣谈:什么是动态规划?_第9张图片

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

漫画 | 趣谈:什么是动态规划?_第10张图片
漫画 | 趣谈:什么是动态规划?_第11张图片
漫画 | 趣谈:什么是动态规划?_第12张图片
漫画 | 趣谈:什么是动态规划?_第13张图片
漫画 | 趣谈:什么是动态规划?_第14张图片

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

漫画 | 趣谈:什么是动态规划?_第15张图片
漫画 | 趣谈:什么是动态规划?_第16张图片
漫画 | 趣谈:什么是动态规划?_第17张图片
漫画 | 趣谈:什么是动态规划?_第18张图片
漫画 | 趣谈:什么是动态规划?_第19张图片
漫画 | 趣谈:什么是动态规划?_第20张图片

第一种情况:

漫画 | 趣谈:什么是动态规划?_第21张图片

第二种情况:

漫画 | 趣谈:什么是动态规划?_第22张图片
漫画 | 趣谈:什么是动态规划?_第23张图片
漫画 | 趣谈:什么是动态规划?_第24张图片
漫画 | 趣谈:什么是动态规划?_第25张图片
漫画 | 趣谈:什么是动态规划?_第26张图片
漫画 | 趣谈:什么是动态规划?_第27张图片

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

漫画 | 趣谈:什么是动态规划?_第28张图片
漫画 | 趣谈:什么是动态规划?_第29张图片
漫画 | 趣谈:什么是动态规划?_第30张图片
漫画 | 趣谈:什么是动态规划?_第31张图片

F(1) = 1;

F(2) = 2;

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

漫画 | 趣谈:什么是动态规划?_第32张图片
漫画 | 趣谈:什么是动态规划?_第33张图片
漫画 | 趣谈:什么是动态规划?_第34张图片
漫画 | 趣谈:什么是动态规划?_第35张图片
漫画 | 趣谈:什么是动态规划?_第36张图片
漫画 | 趣谈:什么是动态规划?_第37张图片
漫画 | 趣谈:什么是动态规划?_第38张图片
漫画 | 趣谈:什么是动态规划?_第39张图片

方法一:递归求解

漫画 | 趣谈:什么是动态规划?_第40张图片

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

漫画 | 趣谈:什么是动态规划?_第41张图片
漫画 | 趣谈:什么是动态规划?_第42张图片
漫画 | 趣谈:什么是动态规划?_第43张图片
漫画 | 趣谈:什么是动态规划?_第44张图片
漫画 | 趣谈:什么是动态规划?_第45张图片
漫画 | 趣谈:什么是动态规划?_第46张图片
漫画 | 趣谈:什么是动态规划?_第47张图片
漫画 | 趣谈:什么是动态规划?_第48张图片
漫画 | 趣谈:什么是动态规划?_第49张图片
漫画 | 趣谈:什么是动态规划?_第50张图片
漫画 | 趣谈:什么是动态规划?_第51张图片
漫画 | 趣谈:什么是动态规划?_第52张图片

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

漫画 | 趣谈:什么是动态规划?_第53张图片
漫画 | 趣谈:什么是动态规划?_第54张图片

方法二:备忘录算法

漫画 | 趣谈:什么是动态规划?_第55张图片

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

漫画 | 趣谈:什么是动态规划?_第56张图片
漫画 | 趣谈:什么是动态规划?_第57张图片
漫画 | 趣谈:什么是动态规划?_第58张图片
漫画 | 趣谈:什么是动态规划?_第59张图片
漫画 | 趣谈:什么是动态规划?_第60张图片
漫画 | 趣谈:什么是动态规划?_第61张图片
漫画 | 趣谈:什么是动态规划?_第62张图片
漫画 | 趣谈:什么是动态规划?_第63张图片
漫画 | 趣谈:什么是动态规划?_第64张图片
漫画 | 趣谈:什么是动态规划?_第65张图片
漫画 | 趣谈:什么是动态规划?_第66张图片
漫画 | 趣谈:什么是动态规划?_第67张图片
漫画 | 趣谈:什么是动态规划?_第68张图片
漫画 | 趣谈:什么是动态规划?_第69张图片
漫画 | 趣谈:什么是动态规划?_第70张图片
漫画 | 趣谈:什么是动态规划?_第71张图片
漫画 | 趣谈:什么是动态规划?_第72张图片
漫画 | 趣谈:什么是动态规划?_第73张图片

方法三:动态规划求解

漫画 | 趣谈:什么是动态规划?_第74张图片

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

漫画 | 趣谈:什么是动态规划?_第75张图片
漫画 | 趣谈:什么是动态规划?_第76张图片
漫画 | 趣谈:什么是动态规划?_第77张图片
漫画 | 趣谈:什么是动态规划?_第78张图片
漫画 | 趣谈:什么是动态规划?_第79张图片

题目二: 国王和金矿

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

漫画 | 趣谈:什么是动态规划?_第80张图片
漫画 | 趣谈:什么是动态规划?_第81张图片
漫画 | 趣谈:什么是动态规划?_第82张图片
漫画 | 趣谈:什么是动态规划?_第83张图片
漫画 | 趣谈:什么是动态规划?_第84张图片

方法一:排列组合

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

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

漫画 | 趣谈:什么是动态规划?_第85张图片
漫画 | 趣谈:什么是动态规划?_第86张图片
漫画 | 趣谈:什么是动态规划?_第87张图片
漫画 | 趣谈:什么是动态规划?_第88张图片
漫画 | 趣谈:什么是动态规划?_第89张图片
漫画 | 趣谈:什么是动态规划?_第90张图片
漫画 | 趣谈:什么是动态规划?_第91张图片
漫画 | 趣谈:什么是动态规划?_第92张图片
漫画 | 趣谈:什么是动态规划?_第93张图片
漫画 | 趣谈:什么是动态规划?_第94张图片
漫画 | 趣谈:什么是动态规划?_第95张图片
漫画 | 趣谈:什么是动态规划?_第96张图片
漫画 | 趣谈:什么是动态规划?_第97张图片
漫画 | 趣谈:什么是动态规划?_第98张图片
漫画 | 趣谈:什么是动态规划?_第99张图片
漫画 | 趣谈:什么是动态规划?_第100张图片
漫画 | 趣谈:什么是动态规划?_第101张图片
漫画 | 趣谈:什么是动态规划?_第102张图片

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

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

F(n,w) =F(n-1,w)(n>1, w<p[n-1])

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

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

漫画 | 趣谈:什么是动态规划?_第103张图片
漫画 | 趣谈:什么是动态规划?_第104张图片
漫画 | 趣谈:什么是动态规划?_第105张图片

方法二:简单递归

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

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

方法三:备忘录算法

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

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

漫画 | 趣谈:什么是动态规划?_第106张图片
漫画 | 趣谈:什么是动态规划?_第107张图片
漫画 | 趣谈:什么是动态规划?_第108张图片
漫画 | 趣谈:什么是动态规划?_第109张图片
漫画 | 趣谈:什么是动态规划?_第110张图片
漫画 | 趣谈:什么是动态规划?_第111张图片
漫画 | 趣谈:什么是动态规划?_第112张图片
漫画 | 趣谈:什么是动态规划?_第113张图片
漫画 | 趣谈:什么是动态规划?_第114张图片
漫画 | 趣谈:什么是动态规划?_第115张图片
漫画 | 趣谈:什么是动态规划?_第116张图片
漫画 | 趣谈:什么是动态规划?_第117张图片
漫画 | 趣谈:什么是动态规划?_第118张图片
漫画 | 趣谈:什么是动态规划?_第119张图片
漫画 | 趣谈:什么是动态规划?_第120张图片
漫画 | 趣谈:什么是动态规划?_第121张图片
漫画 | 趣谈:什么是动态规划?_第122张图片
漫画 | 趣谈:什么是动态规划?_第123张图片
漫画 | 趣谈:什么是动态规划?_第124张图片
漫画 | 趣谈:什么是动态规划?_第125张图片
漫画 | 趣谈:什么是动态规划?_第126张图片
漫画 | 趣谈:什么是动态规划?_第127张图片

方法四:动态规划

漫画 | 趣谈:什么是动态规划?_第128张图片

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

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

漫画 | 趣谈:什么是动态规划?_第129张图片
漫画 | 趣谈:什么是动态规划?_第130张图片
漫画 | 趣谈:什么是动态规划?_第131张图片
漫画 | 趣谈:什么是动态规划?_第132张图片
漫画 | 趣谈:什么是动态规划?_第133张图片
漫画 | 趣谈:什么是动态规划?_第134张图片
漫画 | 趣谈:什么是动态规划?_第135张图片
漫画 | 趣谈:什么是动态规划?_第136张图片
漫画 | 趣谈:什么是动态规划?_第137张图片
漫画 | 趣谈:什么是动态规划?_第138张图片
漫画 | 趣谈:什么是动态规划?_第139张图片

—————END————

你可能感兴趣的:(学习笔记,动态规划,算法设计)