動態規劃

目錄

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閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容

  • 《算法導論》這門課的老師是黃劉生和張曙,兩位都是老人家了,代課很慢很沒有激情,不過這一章非常有意思。更多見:iii...
    mmmwhy閱讀 5,296評論 5 31
  • 動態規劃應用于子問題重疊的情況。對于公共子問題,分治算法會做很多不必要的工作,它會反復求解公共子問題。而動態規劃算...
    LRC_cheng閱讀 439評論 0 1
  • 1、前言 動態規劃和分治算法非常類似,都是通過組合子問題的解來求解原問題。分治算法將問題劃分為互不相交的子問題,而...
    某昆閱讀 1,138評論 0 2
  • 狀態轉移方程 從之前某個階段的某個或某些狀態狀態到下一個狀態之間的關系式,就叫做狀態轉移方程。 最優子結構 每個階...
    Myth52125閱讀 294評論 0 0
  • 大學畢業整整一個月,再一次路過學校旁邊的地鐵站,想下去看看學校,卻又怕停下就不愿走,晚上又沒有可收留我的地方,只...
    小香芋閱讀 343評論 0 0