2022-07-11 動態(tài)規(guī)劃

劍指 Offer II 100. 三角形中最小路徑之和

優(yōu)化路徑,建立表達式子 dp[i+1][j]=Math.min(dp[i][j]+tmp1,dp[i+1][j]);
dp[i+1][j+1]=Math.min(dp[i][j]+tmp2,dp[i+1][j+1]);

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {

        // 動態(tài)規(guī)劃
        int m=triangle.size();int n=triangle.get(m-1).size();

        int[][] dp=new int[m][n];

        for(int i=0;i<m;i++){
           
            for(int j=0;j<n;j++){
     dp[i][j]=Integer.MAX_VALUE;
            }
        }

        dp[0][0]=triangle.get(0).get(0);
        for(int i=0;i<m-1;i++){
           
            for(int j=0;j<i+1;j++){
                int tmp1=triangle.get(i+1).get(j);
                int tmp2=triangle.get(i+1).get(j+1);
              dp[i+1][j]=Math.min(dp[i][j]+tmp1,dp[i+1][j]);
             dp[i+1][j+1]=Math.min(dp[i][j]+tmp2,dp[i+1][j+1]);     
        }
        }

        int min=dp[m-1][0];
        for(int i=0;i<m;i++){
            // System.out.println(dp[m-1][i]);
         min=Math.min(dp[m-1][i],min);
        }
        return min;


    }
}




#### [劍指 Offer II 103\. 最少的硬幣數(shù)目](https://leetcode.cn/problems/gaM7Ch/)
把amount進行劃分,建立dp數(shù)組,數(shù)組的下標對應硬幣的個數(shù),動態(tài)規(guī)劃方程
dp[i]=Math.min(dp[i-coins[j]+1,dp[i]),
初始dp[0]=0,其余數(shù)值是amount+1,
最后進行判定能否dp[amout]>amount?amount:dp[amount];



class Solution {
public int coinChange(int[] coins, int amount) {

    int n=coins.length;
    Arrays.sort(coins);
    if(amount==0){
        return 0;
    }
    

    int[] dp=new int[amount+1];
    Arrays.fill(dp,amount+1);
    dp[0]=0;
    for(int i=1;i<amount+1;i++){
        for(int j=n-1;j>=0;j--){
            if(coins[j]<=i){
           dp[i]=Math.min(dp[i-coins[j]]+1,dp[i]);
            }
        }
    }
    return dp[amount]>amount?-1:dp[amount];
    

}

}

劍指 Offer II 104. 排列的數(shù)目

和上面的一樣,拆分成背包,然后構造動態(tài)規(guī)劃方程。
dp[i]+=dp[i-num];



class Solution {
    public int combinationSum4(int[] nums, int target) {
        // 動態(tài)規(guī)劃和深度優(yōu)先遍歷
        Arrays.sort(nums);

        int  n=nums.length;
        int[] dp=new int[target+1];
        dp[0]=1;
        for(int i=1;i<target+1;i++){
            for(int num:nums){
                if(i>=num){
                  dp[i]+=dp[i-num];
                }
             
            }

        }
        return dp[target];

    }
}

劍指 Offer II 107. 矩陣中的距離

對于矩陣中的任意一個 11 以及一個 00,我們如何從這個 11 到達 00 并且距離最短呢?根據(jù)上面的做法,我們可以從 11 開始,先在水平方向移動,直到與 00 在同一列,隨后再在豎直方向上移動,直到到達 00 的位置。這樣一來,從一個固定的 11 走到任意一個 00,在距離最短的前提下可能有四種方法:
只有 水平向左移動 和 豎直向上移動;

只有 水平向左移動 和 豎直向下移動;

只有 水平向右移動 和 豎直向上移動;

只有 水平向右移動 和 豎直向下移動。

動態(tài)規(guī)劃+深度遍歷

class Solution {
    public int[][] updateMatrix(int[][] mat) {
        int m=mat.length;
        int n=mat[0].length;
         int[][] dp=new int[m][n];
         for(int i=0;i<m;i++){
       Arrays.fill(dp[i],Integer.MAX_VALUE/2);
         }


        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(mat[i][j]==0){
                dp[i][j]=0;
                }
                if(i+1<m){
               dp[i+1][j]=Math.min(dp[i][j]+1,dp[i+1][j]);
                }
                if(j+1<n){
                    dp[i][j+1]=Math.min(dp[i][j]+1,dp[i][j+1]);
                }
            }
        }
         for(int i=m-1;i>=0;i--){
            for(int j=n-1;j>=0;j--){
                if(mat[i][j]==0){
                dp[i][j]=0;
                }
                if(i-1>=0){
               dp[i-1][j]=Math.min(dp[i][j]+1,dp[i-1][j]);
                }
                if(j-1>=0){
                    dp[i][j-1]=Math.min(dp[i][j]+1,dp[i][j-1]);
                }
            }
        }
        return dp;


    }
}

劍指 Offer 60. n個骰子的點數(shù)

這個關鍵是確定前一次和后一次篩子的數(shù)組要配置好。

class Solution {
    public double[] dicesProbability(int n) {
        double[] dp=new double[6];
        Arrays.fill(dp,1.0/6.0);

        int left=n;
    //  

    for(int i=2;i<=n;i++){

    double[] tmp=new double[5*i+1];
    for(int j=0;j<dp.length;j++){
        for(int k=0;k<6;k++){
       tmp[j+k]+=dp[j]/6;
        }
    }
    dp=tmp;
    }
    return dp;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容