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

来源:互联网 发布:手机淘宝收藏宝贝链接 编辑:程序博客网 时间:2024/06/04 01:37

题目:

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

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

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

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

这里写图片描述
方法一:排列组合

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

代码比较简单就不展示了,时间复杂度也很明显,就是O(2^N)。
这里写图片描述
这里写图片描述
这里写图片描述
第一步:找出最优子结构
这里写图片描述
这里写图片描述
这里写图片描述
F(5,10) = MAX( F(4,10) , F(4, 10 - P(4) ) +G【4】 )
第二步:找出最优选择之间的关系
这里写图片描述
第三步:确定问题的边界
这里写图片描述
这里写图片描述
方法二:简单递归

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

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

方法三:备忘录算法

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

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

这里写图片描述

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

原创粉丝点击