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

動(dòng)態(tài)規(guī)劃是一種算法套路,通常用來(lái)求一些最優(yōu)解什么的灭将,它的最精髓的地方個(gè)人認(rèn)為就是它是反過(guò)來(lái)推理的疼鸟,有一些題目按照腦子別的正常思路來(lái)思考往往會(huì)很亂。


舉個(gè)例子來(lái)說(shuō)庙曙;

一只青蛙一次可以跳上1級(jí)臺(tái)階空镜,也可以跳上2級(jí)。求該青蛙跳上一個(gè)n級(jí)的臺(tái)階總共有多少種跳法

正常來(lái)思考:
跳一級(jí)臺(tái)階n = 1:就只有一種方式
跳兩級(jí)臺(tái)階n = 2:兩種方式:1+1捌朴;2吴攒;
跳三級(jí)臺(tái)階n = 3:三種方式:1+1+1;1+2砂蔽;2+1洼怔;
跳四級(jí)臺(tái)階n = 4:五種方式:1+1+2;2+2左驾;1+1+1+1茴厉;1+2+1泽台;2+1+1;
矾缓。。稻爬。嗜闻。。

像這樣越往后越復(fù)雜桅锄,想著想著就亂了琉雳,感覺(jué)就像在腦子里面有棵樹(shù),然后不斷的分叉友瘤,約分越多翠肘,根本理不清。

動(dòng)態(tài)規(guī)劃就是要倒過(guò)來(lái)思考辫秧,知識(shí)點(diǎn)笆丁::::

比如n=10,到達(dá)10級(jí)臺(tái)階只有兩種方式:從第9級(jí)跨一步過(guò)來(lái)盟戏,或者從第8級(jí)跨兩級(jí)過(guò)來(lái)绪妹。

那么我只要知道到達(dá)第9級(jí)的方式數(shù)+到達(dá)第8級(jí)的方式數(shù)就可以了。至于第9級(jí)和第8級(jí)的方式數(shù)到底是多少柿究。那是它們自己的事邮旷,不是我第10級(jí)該管的。

以同樣的方式蝇摸,一直往前推婶肩,到第一級(jí)和第二級(jí),n = 1和n = 2的情況是已知的貌夕。

public class Solution {
    public int JumpFloor(int target) {
        //dp數(shù)組存放到達(dá)每一級(jí)臺(tái)階可以有的方式數(shù)
        int dp[] = new int[target+1];
        for (int i = 0; i < dp.length; i++) {
            if (i==0){
                //0級(jí)臺(tái)階0種方式
                dp[i]=0;
            }else if (i==1){
                //1級(jí)臺(tái)階1種方式
                dp[i]=1;
            }else if (i==2){
                //2級(jí)臺(tái)階2種方式
                dp[i]=2;
            }else {
                //其他臺(tái)階都是從上一級(jí)臺(tái)階跨一步上來(lái)律歼,或者上兩級(jí)臺(tái)階跳2級(jí)上來(lái)
                dp[i] = dp[i-1]+dp[i-2]; 
            }
            
        }
        return dp[target];
    }
}

這種動(dòng)態(tài)規(guī)劃的重點(diǎn)在與從題目的一次可以跳一級(jí)或者兩級(jí)臺(tái)階找到dp[i] = dp[i-1]+dp[i-2]這層關(guān)系,然后再找到特例的幾個(gè)值就是n=1和n=2的情況蜂嗽。

然后再看一個(gè)例子:

1,3,5,9
8,1,3,4
5,0,6,1
8,8,4,0
這是一個(gè)二維數(shù)組苗膝,從左上角開(kāi)始每次只能向右走或者向下走,最后達(dá)到右下角的位置植旧,路徑中所有數(shù)字累加起來(lái)就是路徑和辱揭,返回所有路徑的最小路徑和。

從1開(kāi)始走病附,到達(dá)0问窃,有很多岔道,并且難以確定哪條路比較近完沪,要把所有路徑都列出來(lái)一個(gè)個(gè)求根本不靠譜域庇。
按照動(dòng)態(tài)規(guī)劃倒著思考的思路嵌戈,在本題中要根據(jù)“每次只能向右走或者向下走”推理出到達(dá)最后的0有兩種:從1往下走,或者從4往右走听皿,也就是說(shuō)只要比較一下到達(dá)4的最短路徑和+0和到達(dá)1的最短路徑和+0誰(shuí)比較小即可熟呛。
繼續(xù)推理,到達(dá)4也有兩種:從8往右走尉姨,或者從6往下走庵朝,比較一下到達(dá)8的最短路徑和+4和到達(dá)6的最短路徑和+4誰(shuí)比較小即可。

其中第0行和第0列都是特殊的又厉,最好拿出來(lái)特殊處理九府。


import java.util.ArrayList;
public class Solution {
    public int test(int [][] array) {
        int row = 0;
        int col = 0;
        //存放到達(dá)每個(gè)位置的最短路徑和。
        int dp[][] = new int[array.length][array[0].length];
        //遍歷二維數(shù)組覆致,給dp賦初值侄旬。(用兩個(gè)for遍歷也是一樣的)
        while(row<array.length){
            dp[row][col] = 9999;
            col++;
            if (col == array[row].length){
                row++;
                col = 0;
            }
        }
        
        
         row = 0;
         col = 0;
         
         //遍歷數(shù)組,計(jì)算每個(gè)值的最短路徑和放入dp數(shù)組中
        while(row<array.length){
            if (row == 0 && col == 0){
                //第一個(gè)就是它本身
                dp[row][col] = array[row][col];
            }else if (row == 0){
                //第一行的只能從它左邊走過(guò)來(lái)
                dp[row][col] = array[row][col] + dp[row][col - 1];
            }else if (col == 0){
                //第一列的只能從它上邊走過(guò)來(lái)
                dp[row][col] = array[row][col] + dp[row - 1][col];
            }else {
                //從左邊或者上邊過(guò)來(lái)煌妈,選擇小的一個(gè)儡羔。
                dp[row][col] = array[row][col] + Math.min(dp[row-1][col], dp[row][col - 1]);
            }
            col++;
            if (col == array[row].length){
                row++;
                col = 0;
            }
        }
        
        //打印dp數(shù)組
        for (int[] is : dp) {
            for (int i : is) {
                System.out.print(i+" ");
            }
            System.out.println(" ");
        }

        return dp[dp.length-1][dp[0].length-1];
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市声旺,隨后出現(xiàn)的幾起案子笔链,更是在濱河造成了極大的恐慌,老刑警劉巖腮猖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鉴扫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡澈缺,警方通過(guò)查閱死者的電腦和手機(jī)坪创,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姐赡,“玉大人莱预,你說(shuō)我怎么就攤上這事∠罨” “怎么了依沮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)枪狂。 經(jīng)常有香客問(wèn)我危喉,道長(zhǎng),這世上最難降的妖魔是什么州疾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任辜限,我火速辦了婚禮,結(jié)果婚禮上严蓖,老公的妹妹穿的比我還像新娘薄嫡。我一直安慰自己氧急,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布毫深。 她就那樣靜靜地躺著吩坝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哑蔫。 梳的紋絲不亂的頭發(fā)上钾恢,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音鸳址,去河邊找鬼。 笑死泉懦,一個(gè)胖子當(dāng)著我的面吹牛稿黍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崩哩,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巡球,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了邓嘹?” 一聲冷哼從身側(cè)響起酣栈,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汹押,沒(méi)想到半個(gè)月后矿筝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棚贾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年窖维,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妙痹。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铸史,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怯伊,到底是詐尸還是另有隱情琳轿,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布耿芹,位于F島的核電站崭篡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猩系。R本人自食惡果不足惜媚送,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寇甸。 院中可真熱鬧塘偎,春花似錦疗涉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涵防,卻和暖如春闹伪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壮池。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工偏瓤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椰憋。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓厅克,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親橙依。 傳聞我的和親對(duì)象是個(gè)殘疾皇子证舟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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