算法(5)动态规划法
动态规划算法通常用于求解具有某种最优性质的问题
,在这类问题中,可能会有许多可行解,每一个可行解都对应一个值,我们希望找到具有最优值的解。
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)动态规划法相关推荐
- 五大经常使用算法 之 动态规划法
一.基本概念 动态规划过程是:每次决策依赖于当前状态.又随即引起状态的转移. 一个决策序列就是在变化的状态中产生出来的,所以,这样的多阶段最优化决策解决这个问题的过程就称为动态规划. 动态规划是运筹学 ...
- 【算法】动态规划法——最长公共子序列(LCS)
前言 这篇是大三算法分析与设计课程的第一篇博客,写他是因为上课学到了,并且也算是留作记忆,以后学习时方便使用. 这篇博客主要想讲讲动态规划法,然后以LCS问题为例展开来说一下怎么利用动态规划法求解它, ...
- 算法设计与分析—— 动态规划法
原博客地址: https://www.cnblogs.com/brucemengbm/p/6875340.html 五大经常使用算法 之 动态规划法 一.基本概念 动态规划过程是:每次决策依赖于当前状 ...
- 算法导论之动态规划(最长公共子序列和最优二叉查找树)
动态规划师通过组合子问题的解而解决整个问题,将问题划分成子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解.和分治算法思想一致,不同的是分治算法适合独立的子问题,而对于非独立的子问题,即各 ...
- python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离
动态规划与字符串的编辑距离 动态规划 动态规划(dynamic programming)是解决多阶段决策问题常用的最优化理论,该理论由美国数学家Bellman等人在1957年提出,用于研究多阶段决策过 ...
- 【0-1背包】二进制灰狼算法解决0-1背包问题【Matlab】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.0-1背包问题 1.问题描述 2.数学模型 二 .二进制灰狼算法 1.引言 2.算法改进 3.数学模型 4.算法流程 三 ...
- 动态规划 --- 算法思想介绍
一.动态规划的基本概念 动态规划在五种算法设计方法中难度最大,它建立在最优原则的基础上.采用动态规划方法,可以高效地解决许多用贪婪算法或分治法无法解决的问题.动态规划(dynamic programm ...
- 蚁群算法(ACO)学习笔记
蚁群算法笔记 最近阅读论文,提到几种常见的搜索算法,于是对比学习一下.本文转载数据之巅大神文章对蚁群算法进行简单介绍,并用C++语言编码实现蚁群算法来解决旅行商(TSP)问题. 1 蚁群算法基本原理 ...
- 【路径规划】基于蚁群算法实现多式联运路径规划问题matlab源码
2.蚁群算法基本原理 2.1 算法综述 对于VRP问题,求解算法大致可分为精确算法和人工智能算法两大类.精确性算法基于严格的数学手段,在可以求解的情况下,解的质量较好.但是由于算法严格,运算量大,特别 ...
- 浅谈动态规划,贪婪,回溯算法联系
那么看到这三种算法,你应该有所出现: 贪心法是动态规划法的特例,如0-1背包,最小代价生成树(prim算法和cruskal算法),huffman算法,以及地杰斯特拉算法. 动态规划法是一种方法,注意和 ...
最新文章
- 大家帮忙.谢谢!..(急急急急急)
- AB_PLC_入门教程
- 细思极恐的2016智能交通!怎么回事?
- boost::multi_index模块实现复杂搜索和外键相关的测试程序
- python监听键盘输入 linux_Linux下使用Python捕获键盘输入
- 任务之间的依赖(NSOperation)
- Java集合框架HashMap和ConcurrentHashMap实现分析
- 中国科学院慈松:云计算如何可持续发展
- 超星的Pdg/Pdz转带书签目录Pdf的好方法
- VMP3.6的反调试和反虚拟机
- [笔记][原创]74HC595芯片使用方法介绍
- 阿里巴巴上市路演ppt 官方完整版
- 微服务拆分策略和原则
- 多元线性回归案例(改)
- 删除windows recovery分区
- 傻白入门芯片设计,盘点计算机体系结构顶会
- 【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少
- 2026年中国大数据总体市场规模将超359亿美元
- TCP 短链接 和 长链接
- 热门App 高仿项目12 个 GitHub 上的高仿项目
热门文章
- 将Chrome浏览器网页背景改成豆绿色
- 如何两个电脑共享文件实现多人编辑_excel怎么实现多人共同编辑一个文档
- Linux安装yum(红帽子)rpm
- 安防系统的定义及相关组成部分详解
- 网络直播平台是否需要《信息网络传播视听节目许可证》?
- 移动App Store测试的“七宗罪”
- 关于如何调用苹果自带的地图APP
- 在centos8环境下用asterisk18配置pjsip和webrtc音视频通话教程(一)
- 计算机word文档无法工作,win10所有word文档都打不开如何解决_win10电脑所有word文档无法打开解决教程...
- 多部民族电影在移动电影院App首映发布成功