动态规划算法通常用于求解具有某种最优性质的问题,在这类问题中,可能会有许多可行解,每一个可行解都对应一个值,我们希望找到具有最优值的解。

1 基本思想

动态规划算法的实质是分治思想和解决冗余,因此它与分治法和贪心法类似,它们都是将待求解问题分解为更小的、相同的子问题,然后对子问题进行求解,最终产生一个整体最优解

贪心法的当前选择可能要依赖于已经做出的选择,但不依赖于还未做出的选择和子问题,因此它的特征是自顶向下,一步一步地做出贪心选择,但如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到整体最优解。

分治法中的各个子问题是独立的(即不包含公共的子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成原问题的解。但如果各个子问题是不独立的,则分治法要做许多不必要的工作,即重复地解公共的子问题,对时间的消耗太大。

适合采用动态规划法求解的问题,经分解得到的各个子问题往往不是相互独立的。在求解过程中,将已解决的子问题的解进行保存,在需要时可以轻松找出。这样就避免了大量的无意义的重复计算,从而降低算法的时间复杂性。具体的动态规划算法多种多样,但它们具有相同的填表格式

与贪心法的异同:

  • 相同:都是用于求解最优化问题;都采用分步决策,计算出每一步的最优解。
  • 不同:贪心法的每一步决策依赖于最优量度标准,不依赖于子问题的解和尚未作出的选择;动态规划法每一步决策依赖于子问题的解,无需最优量度标准。

与分治法的异同:

  • 相同:都将问题话分成若干个规模较小的同类型子问题。
  • 不同:分治法会有重叠子问题的现象,对于一些子问题会重复计算,而动态规划法能避免重叠子问题现象。

设n=4,则F(4)的求解过程可表示为一棵二叉树,如图所示。同种阴影表示相同的子问题,即说明F(4)划分的两个子问题F(3)和F(2)不是相互独立的。若采用自顶向下的递归求解, F(2)子问题重复计算。如果n=5,则F(3)和F(2)两个子问题会重复计算。以此类推,n越大,重复计算现象越严重,影响求解效率。

动态规划在求解过程中采用一维数组a存放各个子问题的解。首先,将F(0)和F(1)的解存于a[0]、a[1]中,然后在求解F(2)时,由于F(2)=F(1)+F(0),因此只需直接从数组a中取出F(1)和F(0)的值计算即可,并将F(2)的值存人a[2]中;接下来求解F(3)时,只需从数组a中取出F(2)和F(1)的值直接对F(3)进行求解,并将求得的值存人a[3]中;最后,在求解F(4)时,从数组a中取出F(3)和F(2)的值直接对F(4)进行求解,并将求得的值存入α[4]中。

由此可见,动态规划的关键在于解决冗余,将原来具有指数级复杂性的搜索算法改进成具有多项式时间的算法,这是动态规划算法的根本目的。其实,动态规划是对贪心算法和分治法的一种折中,它所解决的问题往往不具有可爱的贪心实质,但是各个子问题又不是完全零散的。在实现的过程中,动态规划方法需要存储各种状态,所以它的空间复杂性要大于其他的算法,这是一种以空间换取时间的技术

注:参考书本《算法设计与分析》(由王秋芬、吕聪颖、周春光编著)

算法(5)动态规划法相关推荐

  1. 五大经常使用算法 之 动态规划法

    一.基本概念 动态规划过程是:每次决策依赖于当前状态.又随即引起状态的转移. 一个决策序列就是在变化的状态中产生出来的,所以,这样的多阶段最优化决策解决这个问题的过程就称为动态规划. 动态规划是运筹学 ...

  2. 【算法】动态规划法——最长公共子序列(LCS)

    前言 这篇是大三算法分析与设计课程的第一篇博客,写他是因为上课学到了,并且也算是留作记忆,以后学习时方便使用. 这篇博客主要想讲讲动态规划法,然后以LCS问题为例展开来说一下怎么利用动态规划法求解它, ...

  3. 算法设计与分析—— 动态规划法

    原博客地址: https://www.cnblogs.com/brucemengbm/p/6875340.html 五大经常使用算法 之 动态规划法 一.基本概念 动态规划过程是:每次决策依赖于当前状 ...

  4. 算法导论之动态规划(最长公共子序列和最优二叉查找树)

    动态规划师通过组合子问题的解而解决整个问题,将问题划分成子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解.和分治算法思想一致,不同的是分治算法适合独立的子问题,而对于非独立的子问题,即各 ...

  5. python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离

    动态规划与字符串的编辑距离 动态规划 动态规划(dynamic programming)是解决多阶段决策问题常用的最优化理论,该理论由美国数学家Bellman等人在1957年提出,用于研究多阶段决策过 ...

  6. 【0-1背包】二进制灰狼算法解决0-1背包问题【Matlab】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.0-1背包问题 1.问题描述 2.数学模型 二 .二进制灰狼算法 1.引言 2.算法改进 3.数学模型 4.算法流程 三 ...

  7. 动态规划 --- 算法思想介绍

    一.动态规划的基本概念 动态规划在五种算法设计方法中难度最大,它建立在最优原则的基础上.采用动态规划方法,可以高效地解决许多用贪婪算法或分治法无法解决的问题.动态规划(dynamic programm ...

  8. 蚁群算法(ACO)学习笔记

    蚁群算法笔记 最近阅读论文,提到几种常见的搜索算法,于是对比学习一下.本文转载数据之巅大神文章对蚁群算法进行简单介绍,并用C++语言编码实现蚁群算法来解决旅行商(TSP)问题. 1 蚁群算法基本原理 ...

  9. 【路径规划】基于蚁群算法实现多式联运路径规划问题matlab源码

    2.蚁群算法基本原理 2.1 算法综述 对于VRP问题,求解算法大致可分为精确算法和人工智能算法两大类.精确性算法基于严格的数学手段,在可以求解的情况下,解的质量较好.但是由于算法严格,运算量大,特别 ...

  10. 浅谈动态规划,贪婪,回溯算法联系

    那么看到这三种算法,你应该有所出现: 贪心法是动态规划法的特例,如0-1背包,最小代价生成树(prim算法和cruskal算法),huffman算法,以及地杰斯特拉算法. 动态规划法是一种方法,注意和 ...

最新文章

  1. 大家帮忙.谢谢!..(急急急急急)
  2. AB_PLC_入门教程
  3. 细思极恐的2016智能交通!怎么回事?
  4. boost::multi_index模块实现复杂搜索和外键相关的测试程序
  5. python监听键盘输入 linux_Linux下使用Python捕获键盘输入
  6. 任务之间的依赖(NSOperation)
  7. Java集合框架HashMap和ConcurrentHashMap实现分析
  8. 中国科学院慈松:云计算如何可持续发展
  9. 超星的Pdg/Pdz转带书签目录Pdf的好方法
  10. VMP3.6的反调试和反虚拟机
  11. [笔记][原创]74HC595芯片使用方法介绍
  12. 阿里巴巴上市路演ppt 官方完整版
  13. 微服务拆分策略和原则
  14. 多元线性回归案例(改)
  15. 删除windows recovery分区
  16. 傻白入门芯片设计,盘点计算机体系结构顶会
  17. 【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少
  18. 2026年中国大数据总体市场规模将超359亿美元
  19. TCP 短链接 和 长链接
  20. 热门App 高仿项目12 个 GitHub 上的高仿项目

热门文章

  1. 将Chrome浏览器网页背景改成豆绿色
  2. 如何两个电脑共享文件实现多人编辑_excel怎么实现多人共同编辑一个文档
  3. Linux安装yum(红帽子)rpm
  4. 安防系统的定义及相关组成部分详解
  5. 网络直播平台是否需要《信息网络传播视听节目许可证》?
  6. 移动App Store测试的“七宗罪”
  7. 关于如何调用苹果自带的地图APP
  8. 在centos8环境下用asterisk18配置pjsip和webrtc音视频通话教程(一)
  9. 计算机word文档无法工作,win10所有word文档都打不开如何解决_win10电脑所有word文档无法打开解决教程...
  10. 多部民族电影在移动电影院App首映发布成功