喵喵學(xué)動(dòng)態(tài)規(guī)劃(待補(bǔ)完)

1. 導(dǎo)入

2. DP可解

??確認(rèn)一個(gè)問(wèn)題是否DP可解是使用DP算法前最重要的一步。

2.1 相關(guān)概念

??狀態(tài):內(nèi)存中存儲(chǔ)的變量構(gòu)成了計(jì)算機(jī)當(dāng)前的狀態(tài)。
??狀態(tài)轉(zhuǎn)移:如何由當(dāng)前狀態(tài)計(jì)算出下一時(shí)刻的狀態(tài)。
??空間復(fù)雜度:空間復(fù)雜度是由狀態(tài)和狀態(tài)轉(zhuǎn)移計(jì)算所需的變量空間決定的。
??時(shí)間復(fù)雜度:時(shí)間復(fù)雜度由開始的狀態(tài)到最終的狀態(tài)決定的。
??階段:隨著問(wèn)題的解決,在同一個(gè)時(shí)刻可能會(huì)得到的不同狀態(tài)的集合。舉個(gè)例子,假如把你放在一個(gè)圍棋棋盤上的某一點(diǎn),你每一步只能走一格,因?yàn)槟憧梢詵|南西北隨便走,所以你當(dāng)你同樣走四步可能會(huì)處于很多個(gè)不同的位置。從頭開始走了幾步就是第幾個(gè)階段,走了n步可能處于的位置稱為一個(gè)狀態(tài),走了這n步所有可能到達(dá)的位置的集合就是這個(gè)階段下所有可能的狀態(tài)。
??后效性:之前的路線會(huì)影響下一步的選擇,這稱為后效性。

2.2 不同階段引出的不同算法

??假如問(wèn)題有n個(gè)階段,每個(gè)階段都有多個(gè)狀態(tài),不同階段的狀態(tài)數(shù)不必相同,一個(gè)階段的一個(gè)狀態(tài)可以得到下個(gè)階段的所有狀態(tài)中的幾個(gè)。那我們要計(jì)算出最終階段的狀態(tài)數(shù)自然要經(jīng)歷之前每個(gè)階段的某些狀態(tài)。
??一個(gè)問(wèn)題是該用遞推、貪心、搜索還是動(dòng)態(tài)規(guī)劃,完全是由這個(gè)問(wèn)題本身階段間狀態(tài)的轉(zhuǎn)移方式?jīng)Q定的。

2.2.1 遞推:每個(gè)階段只有一個(gè)狀態(tài)

2.2.2 貪心:每個(gè)階段的最優(yōu)狀態(tài)都是由上一個(gè)階段的最優(yōu)狀態(tài)得到的

??貪心算法是動(dòng)態(tài)規(guī)劃的一個(gè)特例。

2.2.3 搜索:每個(gè)階段的最優(yōu)狀態(tài)是由之前所有階段的狀態(tài)的組合得到的

2.2.4 動(dòng)態(tài)規(guī)劃:每個(gè)階段的最優(yōu)狀態(tài)可以從之前某個(gè)階段的某個(gè)或某些狀態(tài)直接得到而不管之前這個(gè)狀態(tài)是如何得到的

??每個(gè)階段的最優(yōu)狀態(tài)可以從之前某個(gè)階段的某個(gè)或某些狀態(tài)直接得到,這個(gè)性質(zhì)叫最優(yōu)子結(jié)構(gòu),能寫出狀態(tài)轉(zhuǎn)移方程的就說(shuō)明滿足最優(yōu)子結(jié)構(gòu)。
??而不管之前這個(gè)狀態(tài)是如何得到的,這個(gè)性質(zhì)叫無(wú)后效性。
??動(dòng)態(tài)規(guī)劃是最優(yōu)化情況下的分治算法,如何拆分問(wèn)題,定義問(wèn)題狀態(tài)和狀態(tài)之間的關(guān)系,使得問(wèn)題能夠以遞推(或者說(shuō)分治)的方式去解決是動(dòng)態(tài)規(guī)劃的關(guān)鍵。拆分問(wèn)題靠的就是狀態(tài)的定義和狀態(tài)轉(zhuǎn)移方程的定義。
??狀態(tài):
??狀態(tài)轉(zhuǎn)移方程:

3. DP經(jīng)典問(wèn)題

3.1 斐波那契數(shù)列

3.2 最大上升子序列

??給定一個(gè)數(shù)列,長(zhǎng)度為N,求這個(gè)數(shù)列的最長(zhǎng)上升(遞增)子數(shù)列(LIS)的長(zhǎng)度.
??以1 7 2 8 3 4為例:
??這個(gè)數(shù)列的最長(zhǎng)遞增子數(shù)列是 1 2 3 4,長(zhǎng)度為4;
??次長(zhǎng)的長(zhǎng)度為3, 包括 1 7 8; 1 2 3 等.

3.3 背包問(wèn)題

??背包問(wèn)題是經(jīng)典的NP完全問(wèn)題,背包容量為不太大的整數(shù)時(shí)可以使用DP算法求解背包問(wèn)題。

3.4 其他問(wèn)題

??背包問(wèn)題. (poj1837,poj1276)
??型如下表的簡(jiǎn)單DP(可參考lrj的書 page149):
??E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
??E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長(zhǎng)公共子序列) (poj3176,poj1080,poj1159)
??C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優(yōu)二分檢索樹問(wèn)題)
??較為復(fù)雜的動(dòng)態(tài)規(guī)劃(如動(dòng)態(tài)規(guī)劃解特別的旅行商TSP問(wèn)題(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
??記錄狀態(tài)的動(dòng)態(tài)規(guī)劃. (POJ3254,poj2411,poj1185)
??樹型動(dòng)態(tài)規(guī)劃(poj2057,poj1947,poj2486,poj3140)
??需要用數(shù)據(jù)結(jié)構(gòu)優(yōu)化的動(dòng)態(tài)規(guī)劃.(poj2754,poj3378,poj3017)
??四邊形不等式理論.較難的狀態(tài)DP(poj3133)

4. 參考資料

https://www.zhihu.com/question/23995189/answer/35429905
https://www.zhihu.com/question/52165201
https://www.zhihu.com/question/38213967/answer/77586917

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動(dòng)態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動(dòng)態(tài)規(guī)劃算法步驟 最長(zhǎng)...
    廖少少閱讀 3,632評(píng)論 0 18
  • 分治方法 將問(wèn)題劃分成互不相交的子問(wèn)題 遞歸地求解子問(wèn)題 將子問(wèn)題的解組合起來(lái) 動(dòng)態(tài)規(guī)劃(兩個(gè)要素:最優(yōu)子結(jié)構(gòu)、子...
    superlj666閱讀 583評(píng)論 0 0
  • 樹形動(dòng)態(tài)規(guī)劃,顧名思義就是樹+DP,先分別回顧一下基本內(nèi)容吧:動(dòng)態(tài)規(guī)劃:?jiǎn)栴}可以分解成若干相互聯(lián)系的階段,在每一個(gè)...
    Mr_chong閱讀 1,600評(píng)論 0 2
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,891評(píng)論 0 33
  • 回溯算法 回溯法:也稱為試探法,它并不考慮問(wèn)題規(guī)模的大小,而是從問(wèn)題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 13,992評(píng)論 0 89

友情鏈接更多精彩內(nèi)容