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

1碍彭、前言

動(dòng)態(tài)規(guī)劃和分治算法非常類(lèi)似,都是通過(guò)組合子問(wèn)題的解來(lái)求解原問(wèn)題。分治算法將問(wèn)題劃分為互不相交的子問(wèn)題庇忌,而動(dòng)態(tài)適應(yīng)于子問(wèn)題重疊的情況

動(dòng)態(tài)規(guī)劃常用于求解“最優(yōu)化問(wèn)題”舞箍,這類(lèi)問(wèn)題有很多個(gè)解,我們希望尋找最優(yōu)解(最大值或最小值)

通常按如下四個(gè)步驟來(lái)設(shè)計(jì)一個(gè)動(dòng)態(tài)規(guī)劃算法:

  • 刻畫(huà)一個(gè)最優(yōu)解的結(jié)構(gòu)特征
  • 遞歸地定義最優(yōu)解的值
  • 計(jì)算最優(yōu)解的值皆疹,通常采用自底向上方法
  • 利用計(jì)算出的信息構(gòu)造一個(gè)最優(yōu)解

或者說(shuō)疏橄,動(dòng)態(tài)規(guī)劃有3個(gè)關(guān)鍵要素。

  • 1略就、最佳子問(wèn)題(將復(fù)雜問(wèn)題轉(zhuǎn)化成簡(jiǎn)單問(wèn)題)
  • 2捎迫、邊界條件(一般是當(dāng)數(shù)據(jù)量極少情況下的結(jié)果,比如n==0或n==1時(shí)的情況)
  • 3表牢、狀態(tài)轉(zhuǎn)移方程(考慮 n-1 和 n這兩種規(guī)模時(shí)窄绒,結(jié)果之間的推導(dǎo))

2、鋼條切割問(wèn)題

給定一段長(zhǎng)為n的鋼條和一個(gè)價(jià)格表崔兴,求解收益最大的鋼條切割方案

鋼條價(jià)格

鋼條價(jià)格如上彰导,怎么切割才能有最大收益呢?通過(guò)鋼條價(jià)格敲茄,我們能手動(dòng)計(jì)算出鋼條最佳切割方案位谋。

最優(yōu)切割方案

定義長(zhǎng)為n的鋼條切割最大收益為Rn,假設(shè)在k位置將鋼條切成兩段能獲得最大收益堰燎,那么這兩段k和n-k肯定也是最大收益掏父,如果我們遍歷循環(huán),可得到如下公式:

最大收益

最大收益為爽待,不切割以及從1到n-1位置切割的收益最大值损同。

換一個(gè)角度重新考慮,如果從1到n-1位置切割鸟款,但左邊的鋼條不再切割膏燃,右邊的鋼條使用最佳方案切割。這樣得到的會(huì)不是也是最佳切割方案呢何什?

很明顯组哩,這種做法也是正常的,想象最終切割結(jié)果处渣,肯定也是符合這種模式的伶贰。這樣簡(jiǎn)單的遞歸更利于編碼。

新公式

動(dòng)態(tài)規(guī)劃的精髓在于保存子問(wèn)題的解罐栈,以提高效率黍衙。在編碼中我們新定義Rn,保存n長(zhǎng)度的最大收益荠诬,并采用自底向上方法琅翻,即先求R0位仁,R1,再求其它方椎,如果單純使用暴力遞歸的話(huà)聂抢,效率非常低。

  public static int[] steel(int[] p){
    int[] s = new int[p.length];
    s[0] = 0;
    int max = 0;
    //因?yàn)殚L(zhǎng)度為0的鋼條棠众,切割最大收益為0琳疏,S[0]已知,所以i從1開(kāi)始
    for (int i = 1; i < p.length; i++) {
        max = 0;
        for (int j = 1; j <= i; j++) {
            //j也必須從1開(kāi)始闸拿,如果從0開(kāi)始空盼,i等于1時(shí),s[i-j]就等于s[1]了胸墙,而s[1]還是未知值
            if (max < (p[j] + s[i-j])) {
                max = p[j] + s[i-j];
            }
        }
        s[i] = max;
    }
    return s;
}

2我注、最大子數(shù)組和

給出一個(gè)數(shù)組,求最大子數(shù)組和迟隅。例如給出如下數(shù)組但骨,最大子數(shù)組和為20

                  -2, 11, -4, 13, -5, -2

此問(wèn)題解題思路和1不一樣。

仔細(xì)考慮智袭,如果設(shè)長(zhǎng)度為n的最大子數(shù)組和為Sn奔缠,那么Sn和Sn-1有什么關(guān)系呢?動(dòng)態(tài)規(guī)劃最重要的思想就是將大問(wèn)題分解為子問(wèn)題吼野,并由子問(wèn)題求解校哎。

直接考慮Sn和Sn-1,好像二者沒(méi)有任何關(guān)系瞳步,如果我們換個(gè)角度考慮闷哆,長(zhǎng)度為n的數(shù)組,且以n結(jié)尾的最大子數(shù)組和為Sn单起,這么定義的話(huà)抱怔,那么根據(jù)Sn的值,如果Sn大于0嘀倒,那么Sn+1等于Sn加上a[n]屈留,如果小于0,那么Sn+1等于a[n]测蘑。

公式為:

dp[i+1] = max(dp[i]+a[i+1] , a[i+1])

  public static int getMaxSubArray(int[] array){
    int[] b = new int[array.length];
    int max = 0;
    b[0] = array[0];
    max = b[0];
    for (int i = 1; i < array.length; i++) {
        if (b[i-1] > 0) {
            b[i] = b[i-1] + array[i];
        }else {
            b[i] = array[i];
        }
        if (max < b[i]) {
            max = b[i];
        }
    }
    return max;
}

3灌危、結(jié)語(yǔ)

動(dòng)態(tài)規(guī)劃還有其它經(jīng)典問(wèn)題,比如矩陣最少相乘次數(shù)碳胳,最長(zhǎng)公共子序列勇蝙,最優(yōu)二叉搜索樹(shù)等等。本文只講了兩個(gè)簡(jiǎn)單例子挨约,簡(jiǎn)述動(dòng)態(tài)規(guī)劃的原理浅蚪,可以更深入思考藕帜,二維的動(dòng)態(tài)規(guī)劃問(wèn)題解決烫罩,以加深理解惜傲。

以上代碼均已上傳至本人的github,歡迎訪(fǎng)問(wèn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贝攒,一起剝皮案震驚了整個(gè)濱河市盗誊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隘弊,老刑警劉巖哈踱,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異梨熙,居然都是意外死亡开镣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)咽扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邪财,“玉大人,你說(shuō)我怎么就攤上這事质欲∈鞑海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵嘶伟,是天一觀(guān)的道長(zhǎng)怎憋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)九昧,這世上最難降的妖魔是什么绊袋? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮铸鹰,結(jié)果婚禮上癌别,老公的妹妹穿的比我還像新娘。我一直安慰自己掉奄,他們只是感情好规个,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著姓建,像睡著了一般诞仓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上速兔,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天墅拭,我揣著相機(jī)與錄音,去河邊找鬼涣狗。 笑死谍婉,一個(gè)胖子當(dāng)著我的面吹牛舒憾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穗熬,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼镀迂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了唤蔗?” 一聲冷哼從身側(cè)響起探遵,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妓柜,沒(méi)想到半個(gè)月后箱季,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棍掐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年藏雏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片作煌。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掘殴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出最疆,到底是詐尸還是另有隱情杯巨,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布努酸,位于F島的核電站服爷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏获诈。R本人自食惡果不足惜仍源,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舔涎。 院中可真熱鬧笼踩,春花似錦、人聲如沸亡嫌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挟冠。三九已至于购,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間知染,已是汗流浹背肋僧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫌吠。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓止潘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辫诅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凭戴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • 動(dòng)態(tài)規(guī)劃應(yīng)用于子問(wèn)題重疊的情況。對(duì)于公共子問(wèn)題泥栖,分治算法會(huì)做很多不必要的工作簇宽,它會(huì)反復(fù)求解公共子問(wèn)題。而動(dòng)態(tài)規(guī)劃算...
    LRC_cheng閱讀 434評(píng)論 0 1
  • 《算法導(dǎo)論》這門(mén)課的老師是黃劉生和張曙吧享,兩位都是老人家了,代課很慢很沒(méi)有激情譬嚣,不過(guò)這一章非常有意思钢颂。更多見(jiàn):iii...
    mmmwhy閱讀 5,279評(píng)論 5 31
  • 狀態(tài)轉(zhuǎn)移方程 從之前某個(gè)階段的某個(gè)或某些狀態(tài)狀態(tài)到下一個(gè)狀態(tài)之間的關(guān)系式,就叫做狀態(tài)轉(zhuǎn)移方程拜银。 最優(yōu)子結(jié)構(gòu) 每個(gè)階...
    Myth52125閱讀 289評(píng)論 0 0
  • 目錄 動(dòng)態(tài)規(guī)劃與分治法 2.動(dòng)態(tài)規(guī)劃求解的最優(yōu)化問(wèn)題應(yīng)該具備的兩個(gè)要素2.1 最優(yōu)子結(jié)構(gòu)2.2 子問(wèn)題重疊 動(dòng)態(tài)規(guī)...
    王偵閱讀 1,390評(píng)論 0 1
  • 第八十七章 回到J市的日子忽然就多了一點(diǎn)煙火氣殊鞭,徐艾每天都能接到來(lái)自劉輝并不打擾的問(wèn)候,他不會(huì)固定在某一個(gè)時(shí)刻打給...
    chief風(fēng)閱讀 319評(píng)論 3 5