博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《算法导论》读书笔记之第15章 动态规划[总结]
阅读量:6242 次
发布时间:2019-06-22

本文共 1793 字,大约阅读时间需要 5 分钟。

前言:

  书中列举四个常见问题,分析如何采用动态规划方法进行解决。今天把动态规划算法总结一下。关于四个问题的动态规范分析过程可以参考前面的几篇日志,链接如下:

  装配线调度问题:

  矩阵链乘问题:

  最长公共子序列问题:

  最优二叉查找树问题:

1、基本概念

  动态规划是通过组合子问题的解而解决整个问题的,通过将问题分解为相互不独立(各个子问题包含有公共的子问题,也叫重叠子问题)的子问题,对每个子问题求解一次,将其结果保存到一张辅助表中,避免每次遇到各个子问题时重新计算。动态规划通常用于解决最优化问题,其设计步骤如下:

(1)描述最优解的结构。

(2)递归定义最优解的值。

(3)按自底向上的方式计算最优解的值。

(4)由计算出的结果构造出一个最优解。

  第一步是选择问题的在什么时候会出现最优解,通过分析子问题的最优解而达到整个问题的最优解。在第二步,根据第一步得到的最优解描述,将整个问题分成小问题,直到问题不可再分为止,层层选择最优,构成整个问题的最优解,给出最优解的递归公式。第三步根据第二步给的递归公式,采用自底向上的策略,计算每个问题的最优解,并将结果保存到辅助表中。第四步骤是根据第三步中的最优解,借助保存在表中的值,给出最优解的构造过程。

动态规划与分治法之间的区别:

(1) 分治法是指将问题分成一些独立的子问题,递归的求解各子问题。
(2) 动态规划适用于这些子问题不是独立的情况,也就是各子问题包含公共子问题。

2、动态规划基础

  什么时候可以使用动态规范方法解决问题呢?这个问题需要讨论一下,书中给出了采用动态规范方法的最优化问题中的两个要素:最优子结构和重叠子结构。

1)最优子结构

  最优子结构是指问题的一个最优解中包含了其子问题的最优解。在动态规划中,每次采用子问题的最优解来构造问题的一个最优解。寻找最优子结构,遵循的共同的模式:

(1)问题的一个解可以是做一个选择,得到一个或者多个有待解决的子问题。

(2)假设对一个给定的问题,已知的是一个可以导致最优解的选择,不必关心如何确定这个选择。

(3)在已知这个选择后,要确定哪些子问题会随之发生,如何最好地描述所得到的子问题空间。

(4)利用“剪贴”技术,来证明问题的一个最优解中,使用的子问题的解本身也是最优的。

最优子结构在问题域中以两种方式变化:

(1)有多少个子问题被使用在原问题的一个最优解中。

(2)在决定一个最优解中使用哪些子问题时有多少个选择。

  动态规划按照自底向上的策略利用最优子结构,即:首先找到子问题的最优解,解决子问题,然后逐步向上找到问题的一个最优解。为了描述子问题空间,可以遵循这样一条有效的经验规则,就是尽量保持这个空间简单,然后在需要时再扩充它。

注意:在不能应用最优子结构的时候,就一定不能假设它能够应用。 警惕使用动态规划去解决缺乏最优子结构的问题!

使用动态规划时,子问题之间必须是相互独立的!可以这样理解,N个子问题域互不相干,属于完全不同的空间。

2)重叠子问题

  用来解决原问题的递归算法可以反复地解同样的子问题,而不是总是产生新的子问题。重叠子问题是指当一个递归算法不断地调用同一个问题。动态规划算法总是充分利用重叠子问题,通过每个子问题只解一次,把解保存在一个需要时就可以查看的表中,每次查表的时间为常数。

  由计算出的结果反向构造一个最优解:把动态规划或者是递归过程中作出的每一次选择(记住:保存的是每次作出的选择)都保存下来,在最后就一定可以通过这些保存的选择来反向构造出最优解。

  做备忘录的递归方法:这种方法是动态规划的一个变形,它本质上与动态规划是一样的,但是比动态规划更好理解!
  (1) 使用普通的递归结构,自上而下的解决问题。
  (2) 当在递归算法的执行中每一次遇到一个子问题时,就计算它的解并填入一个表中。以后每次遇到该子问题时,只要查看并返回表中先前填入的值即可。

3、总结

  动态规划的核心就是找到问题的最优子结构,在找到最优子结构之后的消除重复子问题。最终无论是采用动态规划的自底向上的递推,还是备忘录,或者是备忘录的变型,都可以轻松的找出最优解的构造过程。

转载于:https://www.cnblogs.com/Anker/archive/2013/03/15/2961725.html

你可能感兴趣的文章
docker下部署spring boot
查看>>
【Android Studio安装部署系列】十九、Android studio使用SVN
查看>>
java 按概率产生
查看>>
设计模式(26)-----创建型模式-----建造者模式
查看>>
excel读写技术-:ADO.NET 如何读取 Excel
查看>>
纯前端表格控件SpreadJS与Java结合,实现模板上传和下载等功能
查看>>
推荐 5 款超好用的 Chrome 浏览器插件,文末有从别人的电脑移植插件的方法
查看>>
几种实现延时任务的方式(二)
查看>>
ReactNative:require & import
查看>>
MaxCompute新功能发布
查看>>
decorator(修饰器)的业务应用
查看>>
ES6系列-- 8. Symbol
查看>>
要点提炼| Gradle指南
查看>>
Hexo Next底部powered by的logo栏更改以及注意事项(附官方文档,文末有福利链)
查看>>
我是如何进入阿里巴巴的-面向春招应届生Java面试指南(七)
查看>>
Android Studio 打包生成的 apk 安装包装到手机上闪退
查看>>
Mybatis技术内幕:初始化之加载 mybatis-config
查看>>
mysql与pymysql
查看>>
Fastlane(二):结构
查看>>
vue高阶组件
查看>>