动态规划入门之国王的金矿
最近学习算法,对动态规划不太了解,使用的时候照搬转移方程式,知其然不知其所以然,今天看到一篇动态规划的教程,解释得非常通俗,原文在这里[动态规划入门教程] (http://blog.csdn.net/woshioosm/article/details/7438834),下面我用自己的记忆和理解讲讲我对动态规划的一点小心得。
首先,动态规划方法适合的题型4个基本特点是:
1、最优子结构,当前一个状态得到最佳解时,当前状态在前一个状态下一定有最佳解;
2、子问题重叠,每个状态下要解决的问题除参数不同外,其本质是一样的;
3、有边界,当解决了最后一个子问题时,整个问题得解;
4、子问题独立,解决一个子问题时不依赖于另一个同级的子问题,只与它的母问题有关;
当存在这四个特点时很大程度上可以确定用动态规划的方法解觉了。
而解决动态规划问题的关键在于写出状态转移方程式,一般来说,对应一个状态下,对某件事情是否执行,这是两个子问题,每个子问题都可以递归下一个状态,最终到达边界条件返回,再判断最开始的状态下两个子问题的最优解,即是整个问题的答案。
我再使用国王的金矿的例子来解释动态规划的实现过程:
有一个国家的国王为了增强国力要开采已探明储量的5座金矿,开采每一座金矿所需的人员是固定的,而且为了能顺利将金矿开采又不耽误人民生活,国王决定只调配500人去挖金矿,要同时开采所有金矿,而且每个人民只开采一次,他要向国会说明开采金矿能带来多少金子,但是问题来了,由于没有足够的人手一次性把所有金矿都开采,怎么搞清能获得最多金子的数量是个难题。
苦思良久,国王有一个好办法了,他想,我只要知道前4座金矿最多能开采多少金子就能计算出开采所有金矿最多能获得多少金子了。他对左丞相说我不开采第5座金矿,你想办法告诉我开采前4座金矿最多能获得多少金子,又对右丞相说我要开采第5座金矿,用掉100个劳力,你想办法告诉我开采前4座金矿最多能获得多少金子。
这下子,国王不急丞相急了,左丞相们想啊, 国王这么聪明,要我告诉他前4座金矿最多能开采多少金子,那我是不是也可以学学国王让大臣告诉我前三座金矿最多能挖多少金子呢,于是左丞相叫来两个大臣,对其中一个说,我要240人用于开采第4、5座金矿,其它人手给你调配的话,你告诉我前三座金矿最多能开采多少金子,又对另一个说我要用100人开采第5座金矿,第4座不开采,其它人手给你调配的话你告诉我前三座金矿最多能挖多少金子。
右丞相焦头烂额之际,打听到左丞相有此妙计,不禁豁然开朗,只要学着国王的做法,把前几座金矿的最大开采量交给属下去解决,我只要决定一座金矿是否开采得出较大值不就得到答案了吗?于是,右丞相也依法炮制,也叫两个大臣,让他们分别在开采与不开采第4座金矿的前提下调查前三座金矿的最大产量。
接下来,这个计算金矿最大开采量的办法被传开了,这个国家的人民,纷纷赞扬国王的聪明,他们把这种办法叫做国王的金矿。
国王的故事果然很生动形象啊,知道i-1座金矿的最大产量就一定能知道i座金矿的最大产量,这是最优子结构,每个人要知道i座金矿的最大产量就必须知道知道i-1座金矿的最大产量,这是子问题重叠,最终当考虑第1座金矿的最大产量时,只要看是否有足够人手开采第1座金矿,有的话,答案是已探明的储量,没有的话就是0,然后答案汇报到上级,上级再得出第2座金矿开采与不开采得出的较大产量,再往上汇报…,这就是边界,而每个人从上级得到的前提都是不同的,上级决定开不开采,再将这个前提之一告诉下属,而下属不需要考虑上级给另一个下属什么前提,这是子问题独立。
动态规划入门之国王的金矿相关推荐
- 动态规划经典例题-国王的金矿问题
金矿问题 问题概述: 有一位国王拥有5座金矿,每座金矿的黄金储量不同, 需要参与挖掘的工人人数也不同.例如有的金矿储量是500kg黄金,需 要5个工人来挖掘:有的金矿储量是200kg黄金,需要3个工人 ...
- 动态规划学习-【国王和金矿】
微信公众号 题目: 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同.参与挖矿工人的总数是10人.每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿.要求用程序求解出, ...
- 动态规划简单例子——国王与金矿(c++)
动态规划的要点:确定全局最优解和最优子结构之间的关系,以及问题的边界.以数字的形式表达就是状态转移方程式.下面以一个例子来对他们进行描述. 问题描述: 有一个国家发现了5座金矿,每座金矿的黄金储量不同 ...
- 动态规划:国王与金矿
题目解析 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同.参与挖矿工人的总数是10人.每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿.要求用程序求解出,要想得到尽 ...
- 一文弄懂动态规划(DP Dynamic Programming)下楼梯,国王和金矿,背包问题,Dijkstra算法
动态规划 参考链接 漫画算法,什么是动态规划? DP 动态规划是一种分阶段求解决策问题的数学思想 题目一 问:下楼梯问题,有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶,请 ...
- 很特别的一个动态规划入门教程
很特别的一个动态规划入门教程 今天在网上看到一个讲动态规划的文章,是以01背包为例的,这文章和书上的讲解非常不一样,令我眼前一亮,于是转载一下下--- (说明一下,本人非常痛恨教材公式定理漫天飞,实际 ...
- 0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维
题目四:0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人.每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不 ...
- LQ训练营(C++)学习笔记_动态规划入门
动态规划入门 五.动态规划入门 1.动态介绍 1.1动态规划基本思路 1.2 动态规划基本概念 1.2.1 阶段 1.2.2 状态 1.2.3 决策 1.2.4 状态转移方程 1.2.5 策略 1.3 ...
- C++动态规划入门习题+解析
动态规划入门 ❤️
最新文章
- 面试:为什么 Java 线程没有Running状态?
- 两阶段提交实际项目V1
- 全国大学生智能猫竞速比赛
- 这个对标苹果的微软实体店,开了十一年之后,现在要永久关闭了
- 产品问答 | 作为项目负责人,怎么提升成员工作斗志?
- WIN7如何禁止IE浏览器自动升级
- datatable如何生成级联数据_通过源码分析Mybatis是如何返回数据库生成的自增主键值?...
- Codevs 1010 过河卒 2002年NOIP全国联赛普及组
- CWE 4.3:强化你的数据自我保护能力
- 读javascript高级程序设计04-canvas
- 山西煤炭职业技术学院计算机信息管理,山西煤炭职业技术学院计算机信息系
- 如何从 ArcView 3.3 版本的工程迁移到 ArcGIS Desktop 10 ?
- 苹果linux内核,意外!2020 年的 Linux 内核仍为苹果 Macintosh II 修复驱动
- python制作表情,使用Python制作滑稽表情
- Win10 如何将40G大文件极致压缩
- arcgis制作超链接
- 【转】专家:制造业将大批死亡 都怪马云
- 中国云计算产业2016年度点评
- js根据后缀判断文件文件类型
- 连续十日票房日冠,《人生大事》带热了电影大盘!它凭何突出重围?