动态规划可以说是做题时比较难以理解的算法了,我之前也不是很理解,直到在随机过程中学习了马尔科夫过程后,再看动态规划就觉得很简单了。
本文只是帮助简单粗暴的理解动态规划,熟练地运用需要亲自进行大量的习题练习。

一、动态规划适合解决什么样的问题?
1、问题具有最优子结构
举一个直白易懂的例子:求你走路的时候迈三步能走出的最大距离。如果你想三步走过距离最大,那你每一步都应该很大,在这三步走的过程中,迈出两步的距离也应该是最大的距离。这样,三步最大的就有一个子结构——两步最大。

2、无后效性
仍用上面的例子:你走完第二步的时候,最大距离是2.5米,这个2.5米就包含了你前两步的信息了,就不用再管你第一步是怎么走的了。
粗暴的说就是:当前面的结果知道了,我根本不关心得出这个结果的过程是啥。

如果这两点还不够简单粗暴,那就记住求最值问题一般都能用动态规划。

二、动态规划的解题思路
动态规划所处理的问题是一个多阶段决策问题,不断的求局部最优解,最终得到全局最优。
可以分为四步:

1、问题分解成子问题:按照问题的时间或空间特征,把全局问题分为若干个局部问题。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

2、确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

3、状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。
所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

4、寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

三、动态规划的关键步骤
动态规划的主要难点在于理论上的设计,也就是上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。

使用动态规划求解问题,最重要的就是确定动态规划三要素:

(1)问题的阶段
(2)每个阶段的状态
(3)从前一个阶段转化到后一个阶段之间的递推关系。

递推关系是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。

确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}

参考:
https://blog.csdn.net/zw6161080123/article/details/80639932

简单粗暴地理解动态规划相关推荐

  1. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  2. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  3. 简单粗暴地理解 JavaScript 原型链 (一个充满歪门邪理的理解方法,有助于新手哦!)...

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  4. 如何快速简单粗暴地理解Python中的if __name__ == ‘__main__‘

    1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...

  5. 谷歌简单粗暴“复制-粘贴”数据增广,刷新COCO目标检测与实例分割新高度

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近日,谷歌.UC伯克利与康奈尔大学的研究人员公布了一篇论文 Sim ...

  6. 简单粗暴, 包邮送 30 本 Python 新书。

    为了感谢大家的支持,这次我联系了5个好友一起给各位送书,每个号送5本,一共 30 本,还包邮哦.这些书籍分别是:10本<React+Redux前端开发实战>.10本<Python F ...

  7. 简单粗暴的入门机器学习

    有很多小伙伴问过我零基础要怎么入门机器学习或者人工智能,今天来提炼一下,方便志同道合的朋友们参考. 记得我刚入此山洞准备修炼的时候,就 Google 了好多这类的问题,那时候觉得大家的建议好多呀,这条 ...

  8. matlab求傅里叶级数展开式_简单粗暴傅里叶级数

    简单粗暴傅里叶级数 楠木wnn2000@hust.edu.cn 为什么写本文? 作为笔记. 为什么给文章取这个名字? 前段日子拜读过某pku学霸的<简单粗暴 TensorFlow>.这篇教 ...

  9. 【动态规划模型】金矿模型理解动态规划!(精彩的故事)

    对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本 ...

最新文章

  1. Linux系统下给Qt应用程序配置图标(其余的应用程序也是可以实现添加图标的)
  2. SQL学习笔记 where子句用法,like关键字 嵌套查询
  3. VLC-OFDM系统中一种改进的可变噪声比特功率分配算法
  4. 谁说菜鸟不会数据分析python下载_刻意练习9:《谁说菜鸟不会数据分析python篇》第3章编程基础总计46页学习笔记...
  5. Linux:ubuntu设置交换分区
  6. 【C++】 11_新型的类型转换
  7. NGN学习笔记2——软交换技术
  8. 南天打印机(NANTIAN PR2)配合税控机安装
  9. C++进程和Python进程通信
  10. 解决努比亚 Z11 mini S 刷机导致 wifi 蓝牙失效的办法
  11. iOS 【iOS-切换控制器的手段及异同】
  12. 关于flutter出现Because flutter_app depends on flutter_screenutil >=3.0.0-beta.1 which requires Flutter S
  13. AT91SAM7SE应用 - IRQ
  14. java 反应堆模式_Java NIO 反应堆模式
  15. 智慧经营误区为何很多人还在执迷不悟?
  16. 企业级微信小程序实战详解
  17. [源码阅读]VDO-SLAM笔记[1] Track()中动态obj部分
  18. fluentd 安装、配置、使用介绍
  19. mysql 8.0双主_MySQL —— 配置多主一从 ( 8.0.18 版本 )
  20. Hive 实战(2)--hive分区分桶实战

热门文章

  1. 用卡尔曼滤波处理工程数据的方法与思考with基于GPS与INS组合导航的滤波模型仿真
  2. 纳米金;AuNPs;直 径 1~100nm
  3. windows 通过 Xshell 传文件到 Linux
  4. GNVM版本下载太慢用淘宝镜像速度提百倍哈
  5. 国际歌 英特纳雄耐尔一定要实现
  6. syncthing数据同步应用-docker部署
  7. 计算机图形学阴影的的分类,计算机图形学8_光照模型与阴影处理_.pdf
  8. c语言模拟计算机程序阶乘,C语言程序设计——快速入门与提高CAP-中国大学mooc-题库零氪...
  9. 贝叶斯聂曼准则matlab程序,模式识别试题及总结
  10. 屌丝还是文艺范儿:小米2 VS MX2