數(shù)據(jù)結(jié)構(gòu)與算法-動(dòng)態(tài)規(guī)劃

動(dòng)態(tài)規(guī)劃

不知道大家有沒有聽說這樣的說法

? 貪心:一條路走到黑寇损,就一次機(jī)會(huì)藻茂,只能哪邊看著順眼走哪邊驹暑;
? 回溯:一條路走到黑,無數(shù)次重來的機(jī)會(huì)辨赐,還怕我走不出來优俘;
? 動(dòng)態(tài)規(guī)劃:擁有上帝視角,手握無數(shù)平行宇宙的歷史存檔肖油, 同時(shí)發(fā)展出無數(shù)個(gè)未來兼吓;

因此動(dòng)態(tài)規(guī)劃是一種很好用的算法。

經(jīng)典的動(dòng)態(tài)規(guī)劃問題:0-1背包森枪、0-1背包升級(jí)版视搏、青蛙跳變態(tài)版、棋盤的最小路徑等县袱。

什么時(shí)候可以用動(dòng)態(tài)規(guī)劃浑娜?

雖然說有一個(gè)模型三個(gè)特征,但個(gè)人還是通過一個(gè)流程來判斷是否可以使用動(dòng)態(tài)規(guī)劃式散。

【注】一個(gè)模型:多階段決策最優(yōu)解模型

? 三個(gè)特征:最優(yōu)子結(jié)構(gòu)筋遭、無后效性和重復(fù)子問題

個(gè)人總結(jié)流程

我們假設(shè)背包的最大承載重量是 9。我們有 5 個(gè)不同的物品暴拄,每個(gè)物品的重量分別是 2漓滔,2,4乖篷,6响驴,3。在滿足背包最大重量限制的前提下撕蔼,背包中物品總重量的最大值是多少豁鲤?

看問題判斷:

  1. 找最優(yōu)解
  2. 是否多階段

畫遞歸樹:

0-1背包問題遞歸樹
  1. 從第一個(gè)階段開始(根節(jié)點(diǎn)),觀察有多少種決策可以選擇鲸沮。
  2. 從第二個(gè)階段開始(子樹)琳骡,從觀察有多少種決策可以選擇。
  3. 好讼溺,停楣号。這時(shí)候你就大概會(huì)有一種感覺,就是”重復(fù)“。

如上圖是0-1背包問題的遞歸樹竖席,遞歸樹中的每個(gè)節(jié)點(diǎn)表示一種狀態(tài)耘纱,我們用(i, cw)來表示敬肚。其中毕荐,i 表示將要決策第幾個(gè)物品是否裝入背包,cw 表示當(dāng)前背包中物品的總重量艳馒。

PS.圖參考自王爭(zhēng)《數(shù)據(jù)結(jié)構(gòu)與算法之美》

畫狀態(tài)轉(zhuǎn)移表:

  1. 先畫二維的狀態(tài)轉(zhuǎn)移表憎亚;(這里行列數(shù)代表的意義要明確)
  2. 手工填一部分狀態(tài)轉(zhuǎn)移表;
  3. 找到狀態(tài)轉(zhuǎn)移的規(guī)律弄慰;
  4. 總結(jié)出狀態(tài)轉(zhuǎn)移狀態(tài)方程第美;
image
狀態(tài)轉(zhuǎn)移表

代碼實(shí)現(xiàn)

weight: 物品重量,n: 物品個(gè)數(shù)陆爽,w: 背包可承載重量
public int knapsack(int[] weight, int n, int w) {
  boolean[][] states = new boolean[n][w+1]; // 默認(rèn)值 false
  states[0][0] = true;  // 第一行的數(shù)據(jù)要特殊處理什往,可以利用哨兵優(yōu)化
  states[0][weight[0]] = true;
  for (int i = 1; i < n; ++i) { // 動(dòng)態(tài)規(guī)劃狀態(tài)轉(zhuǎn)移
    for (int j = 0; j <= w; ++j) {// 不把第 i 個(gè)物品放入背包
      if (states[i-1][j] == true) states[i][j] = states[i-1][j];
    }
    for (int j = 0; j <= w-weight[i]; ++j) {// 把第 i 個(gè)物品放入背包
      if (states[i-1][j]==true) states[i][j+weight[i]] = true;
    }
  }
  for (int i = w; i >= 0; --i) { // 輸出結(jié)果
    if (states[n-1][i] == true) return i;
  }
  return 0;
}

多寫多練,就能有自己的一套方法和技巧慌闭。

推薦從0-1背包和青蛙跳變態(tài)版開始練别威。

補(bǔ)充

還有的動(dòng)態(tài)規(guī)劃問題,是從多個(gè)“方向”而來驴剔。

如棋盤的最短路徑問題:

假設(shè)我們有一個(gè) n 乘以 n 的矩陣 w省古。矩陣存儲(chǔ)的都是正整數(shù)向叉。棋子起始位置在右下角吏颖。我們將棋子從左上角移動(dòng)到右下角腿倚。每次只能向右或者向下移動(dòng)一位济蝉。從左上角到右下角甲葬,會(huì)有很多不同的路徑可以走瘾英。我們把每條路徑經(jīng)過的數(shù)字加起來看作路徑的長(zhǎng)度浩村。那從左上角移動(dòng)到右下角的最短路徑長(zhǎng)度是多少呢露戒?

棋盤

那么他就會(huì)從兩個(gè)方向來描验,只有可能從 (i, j-1) 或者 (i-1, j) 來白嘁。

img

因此狀態(tài)轉(zhuǎn)移表變成下圖

狀態(tài)轉(zhuǎn)移表
img

我的動(dòng)態(tài)規(guī)劃之路還有很多要學(xué),大家一起進(jìn)步挠乳!

參考資料

數(shù)據(jù)結(jié)構(gòu)與算法之美 https://time.geekbang.org/column/article/75702

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末权薯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子睡扬,更是在濱河造成了極大的恐慌盟蚣,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卖怜,死亡現(xiàn)場(chǎng)離奇詭異屎开,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)马靠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門奄抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔼两,“玉大人,你說我怎么就攤上這事逞度《罨” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵档泽,是天一觀的道長(zhǎng)俊戳。 經(jīng)常有香客問我,道長(zhǎng)馆匿,這世上最難降的妖魔是什么抑胎? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮渐北,結(jié)果婚禮上阿逃,老公的妹妹穿的比我還像新娘。我一直安慰自己赃蛛,他們只是感情好恃锉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焊虏,像睡著了一般淡喜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诵闭,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天炼团,我揣著相機(jī)與錄音,去河邊找鬼疏尿。 笑死瘟芝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褥琐。 我是一名探鬼主播锌俱,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼敌呈!你這毒婦竟也來了贸宏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤磕洪,失蹤者是張志新(化名)和其女友劉穎吭练,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體析显,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲫咽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片分尸。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锦聊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出箩绍,到底是詐尸還是另有隱情孔庭,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布伶选,位于F島的核電站史飞,受9級(jí)特大地震影響尖昏,放射性物質(zhì)發(fā)生泄漏仰税。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一抽诉、第九天 我趴在偏房一處隱蔽的房頂上張望陨簇。 院中可真熱鬧,春花似錦迹淌、人聲如沸河绽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耙饰。三九已至,卻和暖如春纹份,著一層夾襖步出監(jiān)牢的瞬間苟跪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工蔓涧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留件已,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓元暴,卻偏偏與公主長(zhǎng)得像篷扩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茉盏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容