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

在前两集漫画中,我们通过一个算法问题的完整解题过程,讲述了动态规划的基本概念和思想。没看过前两集的朋友可以点击下面的链接:

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

在第二集的末尾,给出了一道动态规划的进阶题目——国王和金矿。让我们先来回顾一下问题:

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

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第1张图片

下面,继续我们的故事。

————————————
漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第2张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第3张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第4张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第5张图片

方法一:排列组合

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

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

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第6张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第7张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第8张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第9张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第10张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第11张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第12张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第13张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第14张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第15张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第16张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第17张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第18张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第19张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第20张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第21张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第22张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第23张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第24张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第25张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第26张图片

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

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

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

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

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

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第27张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第28张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第29张图片

方法二:简单递归

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

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

方法三:备忘录算法

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

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

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第30张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第31张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第32张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第33张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第34张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第35张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第36张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第37张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第38张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第39张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第40张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第41张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第42张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第43张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第44张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第45张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第46张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第47张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第48张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第49张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第50张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第51张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第52张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第53张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第54张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第55张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第56张图片

方法四:动态规划

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第57张图片

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

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

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第58张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第59张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第60张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第61张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第62张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第63张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第64张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第65张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第66张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第67张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第68张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第69张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第70张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第71张图片

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)_第72张图片

你可能感兴趣的:(TCB-算法,漫画说算法)