动态规划

目录

1. 动态规划与分治法

分治法将问题划分为互不相交的子问题,递归地求解子问题,再将它们组合起来,求出原问题的解。

动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。动态规划对每个子子问题只求解一次,将其解保存在一个表格中。

2.动态规划求解的最优化问题应该具备的两个要素

2.1 最优子结构

一个问题的最优解包含其子问题的最优解。(无权最长路径就不满足)
使用动态规划方法时,我们用子问题的最优解来构造原问题的最优解。

1.通用模式
发掘最优子结构的通用模式:
step1.证明问题的最优解的第一个组成部分是做出一个选择,例如,选择钢条第一次切割位置,选择矩阵链的划分位置等。做出选择会产生一个或多个待解决的子问题。
step2.对于一个给定的问题,在其可能的第一步选择中,你假定已经知道哪种才会得到最优解。
step3.给定可获得最优解的选择后,你确定这次选择会产生哪些子问题,以及如何最好地刻画子问题空间
step4.利用cut-and-paste技术证明:作为构成原问题最优解的组成部分,每个子问题的解就是它本身的最优解。

反证法:
假定子问题的解不是其自身的最优解,那么我们就可以从原问题的解中cut这些非最优解,将最优解paste进去,从而得到原问题的一个更优的解,这月最初的解是原问题的最优解的前提矛盾。

2.最优子结构的两个方面以及运行时间的估算
对于不同问题领域,最优子结构的不同体现在两个方面:
a.原问题的最优解设计多少个子问题
b.在确定最优解使用哪些子问题时,我们需要考察多少种选择

可以使用子问题的总数和每个子问题需要考虑多少种选择这两个因素的乘积来粗略分析动态规划的运行时间。

3.不具备最优子结构的例子
无权最短路径:找到一条从u到v的边数最少的路径(具有最优子结构性质)
无权最长路径:找到一条从u到v的边数最多的简单路径(不具备)



最长路径问题和最短路径问题的解都用到了两个子问题,但两个最长简单路径子问题是相关的,而两个最短路径字问题是无关的。
根本原因是:最短路径子问题间是不共享资源的。但是最长路径问题求解一个子问题用到了某些资源,导致这些资源在求解其他子问题时不可用。

2.2 子问题重叠

递归算法反复求解相同的子问题

3. 动态规范的四个步骤

step1. 刻画一个最优解的结构特征
step2. 递归地定义最优解的值
step3. 计算最优解的值,通常采用自底向上的方法
step4. 利用计算出的信息构造一个最优解
自顶向下的备忘方法优势在于:子问题空间中某些子问题完全不必求解,因为此种方法只会求解哪些绝对必要的子问题
自底向上的方法:没有递归调用的开销,表的维护开销也更小。

4. 实例

4.1 钢条切割

1)最优子结构与递归定义最优解的值
长度为n英寸的钢条总共有2的n-1次方种切割方案,因为每英寸的地方总可以选择切割或者不切割。



钢条切割问题满足最优子结构:问题的最优解由相关子问题的最优解组合而成,而这些子问题可以独立求解。(在所有可能的两段切割方案中选取组合效益最大者,构成原问题的最优解)

另一种更为简单的递归求解方法:将钢条从左边切割下长度为i的一段,只对右边剩下的长度为n-i的一段继续进行切割(递归求解),对左边一段则不再进行切割。


证明1.为什么第二种递归式也成立?

证明:r(i) + r(n - i)是重复的
a. r(1) + r(n - 1) 等于 p(1) + r(n - 1)
b. r(2) + r(n - 2) 可以分解为两个部分:
    p(2) + r(n - 2)以及 p(1) + p(1) + r(n -2)
    其中p(1) + p(1) + r(n - 2) 包含在a中
c.r(3) + r(n - 3)可以分解为:
   p(3) + r(n - 3)
   p(2) + r(1) + r(n-3) 包含在b
   p(1) + r(2) + r(n-3) 包含在a
...

简要说明如下:
对于左半边的分割在之前的遍历当中已经考虑到了,并不需要再考虑。
比如,如果从距离钢条左边2英寸处分割成两半然后只考虑右边的n-2英寸的钢条的分割的话,不需要考虑将左边2英寸的钢条再分为两个1英寸的情况;
因为在计算将左边分为一个1英寸这种情况的时,另外的n-1部分其中有一种情况就是将其分为一个1寸和n-2寸的情况,这样就考虑了之前所说的那种情况

2)自底向上计算最优解的值


3)利用计算出来的信息构造一个最优解
下面给出的是BOTTOM-UP-CUT-ROD的扩展版本,它对长队为j的钢条不仅计算最大收益指rj,还保存最优解对应的第一段钢条的切割长度sj:




构造最优解:


证明2:为什么构造最优解是正确的?

证明:
长度为j的最优切割为s[j] = i,那么这个i是不用切割的,只用去切割剩下的j - i
因此一直打印s[j],然后再去切割j - s[j]

4.2 矩阵链乘法


完全括号化方案的数量:
当n = 1,由于只有一个矩阵,因此只有一种完全括号化方案
当n>=2,完全括号化的矩阵乘积可描述为两个完全括号化的部分积相乘的形式:


1)最优括号化方案的结构特征


2)一个递归求解方案
令m[i, j]表示计算矩阵Ai..j所需的标量乘法次数的最小值


3)计算最优代价



4)构造最优解


证明:构造最优解的方法是正确的

证明:
a.当i == j时,只有一个举证,直接打印
b.当i != j时,最外围打印( print1  print2)
    print1打印的是(s, i, k)
    pirnt2打印的是(s, k + 1, j)
    因为s[i, j] = k表示矩阵链从k处分为两个部分
因此是完全正确的

4.3 最长公共子序列

子序列的定义:一个给定的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。


1)LCS的最优子结构


2)一个递归解
定义c[i, j]表示Xi和Yj的LCS的长度。


3)计算LCS的长度


4)构造LCS



正确性证明:
完全根据2)中公式进行,分为三种情况:


4.4 最优二叉搜索树

在给定单词出现频率的前提下,我们应该如何组织一颗二叉搜索树,使得所有搜索操作访问的结点总数最少。



1)最优子结构


g

2)一个递归算法



3)计算最优解


4.5 0-1背包问题

参见0/1背包问题——动态规划、回溯、分支限界法对比
1)问题的定义


2)最优子结构
g

3)递归算法

4)计算最优解


4.6 旅行商问题

参见旅行商(TSP)问题专题——多种方法对比

  • 一个售货员必须访问n个城市,恰好访问每个城市一次,并最终回到出发城市。
    售货员从城市i到城市j的旅行费用是一个整数,旅行所需的全部费用是他旅行经过的的各边费用之和,而售货员希望使整个旅行费用最低。
  • (等价于求图的最短哈密尔顿回路问题)令G=(V, E)是一个带权重的有向图,顶点集V=(v0, v1, ..., vn-1)。从图中任一顶点vi出发,经图中所有其他顶点一次且只有一次,最后回到同一顶点vi的最短路径。

4.6.1 刻画一个最优解的结构特征(最优子结构)

  • 假设s0s1s2...sn,其中s0=sn,是一条从s0出发的最短简单回路。
    那么有sisi+1...sn也是从si出发,回到起点sn的一条最短回路。(cut-and-paste证明)

4.6.2 递归地定义最优解的值(重叠子问题)

  • 设TSP顶点编号为0,1,2,...,n-1.
    假设从顶点0出发
  • d(i, V')定义为从顶点i出发经过V'中各顶点有且仅有一次,最后回到顶点0的最短路径长度
  • cij定义为顶点i到顶点j的距离

一个示例:

费用矩阵

递归求解子问题(重叠子问题)

4.6.3 计算最优解的值,通常采用自底向上的方法

  • 假设顶点总数为n
    则6.2中表的i范围是0 ≤ i ≤ n-1,j的范围是0 ≤ j ≤ 2n-1 - 1
  • 一个特别的规律:k表示第k-1位上是否为1,如下图所示


因此将一个集合转变成了一个数与之对应,数中对应的为位1,表示该数包含在集合中,否则,该数不在集合中。


按程序计算的表格

4.6.4 利用计算出的信息构造一个最优解

第一个打印0

4.7 所有结点对的最短路径问题

参见最短路径专题

  • 所有结点对最短路径问题
    对于每对结点u和v,找到从结点u到结点v的最短路径。

  • 基本方法和重复平方法——Θ(n4)和Θ(n3lgn)
    1)动态规划
    2)基本方法去掉一个不确定的边,需要遍历找到是哪个边
    3)重复平方法与基本方法的区别在于:基本方法到最终解,每次增加一条边;重复平方法每次增加一倍。

  • Floyd-Warshall——Θ(n3)
    1)动态规划
    2)Floyd-Warshall去掉中间一个确定的点,不用遍历求最小

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容

  • 《算法导论》这门课的老师是黄刘生和张曙,两位都是老人家了,代课很慢很没有激情,不过这一章非常有意思。更多见:iii...
    mmmwhy阅读 5,243评论 5 31
  • 动态规划应用于子问题重叠的情况。对于公共子问题,分治算法会做很多不必要的工作,它会反复求解公共子问题。而动态规划算...
    LRC_cheng阅读 424评论 0 1
  • 1、前言 动态规划和分治算法非常类似,都是通过组合子问题的解来求解原问题。分治算法将问题划分为互不相交的子问题,而...
    某昆阅读 1,105评论 0 2
  • 状态转移方程 从之前某个阶段的某个或某些状态状态到下一个状态之间的关系式,就叫做状态转移方程。 最优子结构 每个阶...
    Myth52125阅读 278评论 0 0
  • 大学毕业整整一个月,再一次路过学校旁边的地铁站,想下去看看学校,却又怕停下就不愿走,晚上又没有可收留我的地方,只...
    小香芋阅读 327评论 0 0