動(dòng)態(tài)規(guī)劃問題總結(jié)

動(dòng)態(tài)規(guī)劃學(xué)習(xí)總結(jié)

最近在學(xué)習(xí)算法,希望寫一篇博客來(lái)記錄自己學(xué)習(xí)過程和總結(jié)一下自己學(xué)到的東西,方便以后的歸納整理。我覺得寫博客是一種很好的整理知識(shí)點(diǎn)的方法,在寫的過程你可以認(rèn)認(rèn)真真的去歸納知識(shí)點(diǎn)薛匪,發(fā)現(xiàn)自己理解的不到位的地方,從而去提高自己脓鹃。雖然需要花點(diǎn)時(shí)間逸尖,但是很有幫助。
下面我將從三個(gè)方面來(lái)介紹動(dòng)態(tài)規(guī)劃的內(nèi)容瘸右。
1.動(dòng)態(tài)規(guī)劃介紹
2.動(dòng)態(tài)規(guī)劃的解題思路
3.動(dòng)態(tài)規(guī)劃例題分析

[TOC]

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

1.什么是動(dòng)態(tài)規(guī)劃

動(dòng)態(tài)規(guī)劃就是一種用來(lái)解決最優(yōu)化問題的算法思想娇跟。簡(jiǎn)單來(lái)說(shuō),動(dòng)態(tài)規(guī)劃將一個(gè)復(fù)雜的問題分解成若干個(gè)子問題太颤,通過綜合子問題的最優(yōu)解來(lái)得到原問題的最優(yōu)解苞俘。需要注意的是,動(dòng)態(tài)規(guī)劃會(huì)將每個(gè)求解的子問題的解都記錄下來(lái)龄章。這樣當(dāng)下次碰到同樣的子問題的時(shí)候 吃谣,直接使用之前記錄的結(jié)果。而不是重復(fù)計(jì)算做裙。
按我的理解來(lái)說(shuō)岗憋,動(dòng)態(tài)規(guī)劃就是 自底向上求解,而一般的遞歸是自頂向下求解菇用。當(dāng)我們使用自底向上求解的時(shí)候澜驮,我們解決問題的時(shí)間復(fù)雜度就可以轉(zhuǎn)化為O(n),從而大大優(yōu)化我們的算法。但是問題來(lái)了惋鸥,我們?nèi)绾巫缘紫蛳虑蠼饽卦忧睿灰保覀兿葋?lái)了解動(dòng)態(tài)規(guī)劃的基本性質(zhì)卦绣。

2.動(dòng)態(tài)規(guī)劃三個(gè)重要概念
1.邊界

邊界問題是動(dòng)態(tài)規(guī)劃很重要的一個(gè)問題耐量,因?yàn)槲覀冊(cè)谶M(jìn)行N次循環(huán)迭代的時(shí)候,要先找出初始問題的最優(yōu)解滤港,這就是我們說(shuō)到底邊界問題廊蜒。及求出F(1),F(2)等初始值的最優(yōu)解,一般這些邊界的解我們很容易就可以得到溅漾。當(dāng)我們分析出邊界的最優(yōu)解時(shí)山叮,就可以通過循環(huán)迭代來(lái)求出整個(gè)問題的最優(yōu)解。

2.最優(yōu)子結(jié)構(gòu)

最優(yōu)子結(jié)構(gòu)就是我們分解的每個(gè)子問題的解添履。由于動(dòng)態(tài)規(guī)劃是自底向上求解屁倔,所以我們?cè)诘拈_始,只需要找到初始的計(jì)算邊界問題暮胧,求出F(1),F(2)最小子問題的最優(yōu)解锐借,然后試著去尋找規(guī)律。

3.狀態(tài)轉(zhuǎn)移方程

狀態(tài)轉(zhuǎn)移方程是動(dòng)態(tài)規(guī)劃的核心往衷,決定了問題的每一階段和下一階段的關(guān)系钞翔。我們?cè)谘h(huán)迭代的時(shí)候,其實(shí)每次迭代的核心邏輯就是使用狀態(tài)轉(zhuǎn)移方程尋找下一問題的最優(yōu)解席舍。

4.動(dòng)態(tài)規(guī)劃的適用場(chǎng)景

當(dāng)我們遇到求什么最大值布轿,最小值,最短路徑等等類似問題的時(shí)候来颤,我就就可以考慮是不是可以用動(dòng)態(tài)規(guī)劃的算法來(lái)解決問題汰扭。
說(shuō)了這么多是不是有種一臉懵逼的感覺,我是誰(shuí)脚曾?我在哪东且?我要干什么?喝口咖啡本讥,下面咋們來(lái)通過一道例題來(lái)分析動(dòng)態(tài)規(guī)劃的解題套路珊泳。

動(dòng)態(tài)規(guī)劃解題思路

在學(xué)習(xí)了幾道動(dòng)態(tài)規(guī)劃的問題后,我覺得動(dòng)態(tài)規(guī)劃問題還是有固定的解題思路的拷沸,下面我將自己的總結(jié)分享給大家色查。
首先先來(lái)一道例題。對(duì)應(yīng)為L(zhǎng)eetcode第53題撞芍。

最大子序和

給定一個(gè)整數(shù)數(shù)組 nums 秧了,找到一個(gè)具有最大和的連續(xù)子數(shù)組(子數(shù)組最少包含一個(gè)元素),返回其最大和序无。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續(xù)子數(shù)組 [4,-1,2,1] 的和最大验毡,為 6衡创。

拿到這道題,一看是求最大和晶通,那就拿動(dòng)態(tài)規(guī)劃的方式來(lái)解決這道題吧璃氢。我們把動(dòng)態(tài)規(guī)劃的三大核心概念去分析這道題。
給定dp[]存儲(chǔ)每個(gè)子問題的最優(yōu)解,mums[]為給定的數(shù)組狮辽。
1.邊界問題一也。
當(dāng)給定的數(shù)組長(zhǎng)度為0是,我們返回0.
2.最優(yōu)子結(jié)構(gòu)
本題是分析n數(shù)組的最大連續(xù)子數(shù)組的和喉脖,我們可以先求數(shù)組長(zhǎng)度為1時(shí)的最優(yōu)解椰苟,及F(1)的最優(yōu)解。
F(1):只能取-2 树叽,所以F(1)的最優(yōu)解為-2
F(2):1> -2+1 > -2, 所以F(2)的最優(yōu)解為1
F(3):.........
3.狀態(tài)轉(zhuǎn)移方程
F(n) = max(nums[n], nums[n] + F(n))

為什么狀態(tài)轉(zhuǎn)移方程是這樣的呢舆蝴。我們來(lái)分析一下。
首先題目要求的是 連續(xù)子數(shù)組,我們必須保證我們所取到的每一個(gè)子問題的最優(yōu)子結(jié)構(gòu)都是連續(xù)子數(shù)組菱皆。所以我們從F(2)開始只有兩種選擇须误。
1.只選擇nums[2]
2.選擇 nums[2] + F(1)
這樣才能保證取到的數(shù)組是連續(xù)子數(shù)組,我們只需要去取這兩個(gè)結(jié)果 的最大值仇轻。

動(dòng)態(tài)規(guī)劃例題分析

最大子序和代碼分析
  public int maxSubArray(int[] nums) {
        int maxSum = nums[0];                      //maxSum為最終結(jié)果
        int curSum = 0;                            //curSum為動(dòng)態(tài)和數(shù)
        for (int i = 0; i < nums.length; i++) {
            if (curSum < 0) {  
//curSum<0京痢,那么curSum沒有利用價(jià)值了,直接至0篷店;curSum>0祭椰,之后才有可能加出更大的和
                curSum = 0;
            }
            curSum += nums[i];
            if (curSum > maxSum) {
                maxSum = curSum;
            }
        }
        return maxSum;
    }

理解動(dòng)態(tài)規(guī)劃我們可以先從簡(jiǎn)單問題入手,先把簡(jiǎn)答的問題搞懂然后一步一步去理解更難的動(dòng)態(tài)規(guī)劃問題疲陕。當(dāng)然自己在平時(shí)還要多看代碼方淤,理解別人的解題思路。

相關(guān)學(xué)習(xí)資料

程序員小灰講動(dòng)態(tài)規(guī)劃
什么是動(dòng)態(tài)規(guī)劃

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹄殃,一起剝皮案震驚了整個(gè)濱河市携茂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诅岩,老刑警劉巖讳苦,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吩谦,居然都是意外死亡鸳谜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門式廷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咐扭,“玉大人,你說(shuō)我怎么就攤上這事』确荆” “怎么了袜爪?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)穗慕。 經(jīng)常有香客問我饿敲,道長(zhǎng)妻导,這世上最難降的妖魔是什么逛绵? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮倔韭,結(jié)果婚禮上术浪,老公的妹妹穿的比我還像新娘。我一直安慰自己寿酌,他們只是感情好胰苏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著醇疼,像睡著了一般硕并。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秧荆,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天倔毙,我揣著相機(jī)與錄音,去河邊找鬼乙濒。 笑死陕赃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颁股。 我是一名探鬼主播么库,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甘有!你這毒婦竟也來(lái)了诉儒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亏掀,失蹤者是張志新(化名)和其女友劉穎忱反,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幌氮,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缭受,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了该互。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米者。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔓搞,到底是詐尸還是另有隱情胰丁,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布喂分,位于F島的核電站锦庸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒲祈。R本人自食惡果不足惜甘萧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梆掸。 院中可真熱鬧扬卷,春花似錦、人聲如沸酸钦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卑硫。三九已至徒恋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欢伏,已是汗流浹背入挣。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颜懊,地道東北人财岔。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像河爹,于是被迫代替她去往敵國(guó)和親匠璧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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