国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

刷題之動態(tài)規(guī)劃-路徑問題

這篇具有很好參考價值的文章主要介紹了刷題之動態(tài)規(guī)劃-路徑問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

大家好,我是jiantaoyab,開始刷動態(tài)規(guī)劃的題目了,要特別注意初始化的時候給什么值。

動態(tài)規(guī)劃5個步驟

  1. 狀態(tài)表示 :dp數(shù)組中每一個下標(biāo)對應(yīng)值的含義是什么->dp[i]表示什么
  2. 狀態(tài)轉(zhuǎn)移方程: dp[i] 等于什么
  3. 1 和 2 是動態(tài)規(guī)劃的核心步驟,第三步是初始化,保證填表的時候不越界
  4. 填表順序:為了保證填寫當(dāng)前狀態(tài)的時候,所需要的狀態(tài)已經(jīng)計算過
  5. 返回值

第 N 個泰波那契數(shù)

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

我們用動態(tài)規(guī)劃來解決

  1. dp[i] : 表示第i個泰波那契數(shù)
  2. dp[i] = dp[i - 3] + dp[i - 2] + dp [i - 1]
  3. 初始化: dp[0] = 0; dp[1] = 1 ; dp[2] = 1;
  4. 填表順序:從左道右
  5. 返回值:dp[n]

代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-850417.html

class Solution {
public:
    int tribonacci(int n) {
      if(n == 0) return 0;
      if(n == 1 || n == 2) return 1;
      int dp[1000] = {0};
      dp[0] = 0, dp[1] = 1, dp[2] = 1;
      for(int i = 3; i <= n; i++)
      {
        dp[i] = dp[i-3] + dp[i-2] + dp[i-1];
      }
      return dp[n];
    }
};

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

優(yōu)化一下,可以看到只需要三個變量也能完成這個操作。

class Solution {
public:
    int tribonacci(int n) {
      if(n == 0) return 0;
      if(n == 1 || n == 2) return 1;
      int a = 0, b = 1, c = 1, d = 0;
      for(int i = 3; i <= n; i++)
      {
        d = a + b + c;
        a = b;
        b = c;
        c = d;
      }
      return d;
    }
};

三步問題

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

  1. dp[i] :表示去到當(dāng)前臺階有幾種方法
  2. dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
  3. 初始化 dp[1] = 1; dp[2] = 2; dp[3] = 4;
  4. 填表順序從左到右
  5. 返回值 d[n]

代碼

class Solution {
public:
    int waysToStep(int n) {
      vector<int>dp(n + 1);
      if(n == 1 || n == 2) return n;
      if(n == 3) return 4;
      const int MOD = 1000000007;
      dp[1] = 1; dp[2] = 2; dp[3] = 4;
      for(int i = 4; i <= n; i++)
      {
        dp[i] = ((dp[i-3] + dp[i-2]) % MOD + dp[i-1]) % MOD;
      }
      return dp[n];
    }
};

使用最小花費爬樓梯

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

  1. dp[i]:到達 i位置的最小花費
  2. dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
  3. 初始化:dp[0] = dp[1] = 0;
  4. 填表順序:從左到右
  5. 返回值:dp[n]

代碼

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
      int n = cost.size();
      vector<int> dp(n + 1);
      dp[0] = dp[1] = 0;
      for(int i = 2; i <= n; i++)
      {
        dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
      }
      return dp[n];
      
    }
};

解碼方法

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

  1. dp[i]:是表示是 i 位置為結(jié)尾的解碼方法總數(shù)
  2. dp[i] = dp[i - 1] + dp [i - 2];
  3. 初始化:dp[0] = 0 / 1 dp[1] = 0/ 1/ 2
  4. 填表順序:從左到右
  5. 返回值:dp[n - 1]

代碼

class Solution {
public:
    int numDecodings(string s) {
      int n = s.size();
      vector<int> dp (n);
      
      //初始化
      dp[0] = s[0] != '0';
      if(n == 1) return dp[0];
      if(s[0] != '0' && s[1] != '0') dp[1] += 1;
      int tmp = (s[0] - '0') * 10 + (s[1] - '0');
      if(tmp >= 10 && tmp <= 26) dp[1] += 1;
      
      //處理剩下的
     for(int i = 2; i < n; i++)
     {
      //單獨一個字符
        if(s[i] != '0') dp[i] += dp[i - 1];
      //2個字符
        int tmp = (s[i - 1] - '0') * 10 + (s[i] - '0');
        if(tmp >= 10 && tmp <= 26) dp[i] += dp[i - 2];
     }
      return dp[n - 1];
    }
};

優(yōu)化代碼

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

class Solution {
public:
    int numDecodings(string s) {
      int n = s.size();
      vector<int> dp (n + 1); 
      //初始化
      dp[0] = 1;
      dp[1] = s[1 - 1] != '0';  
      //處理剩下的
     for(int i = 2; i <= n; i++)
     {
      //單獨一個字符
        if(s[i - 1] != '0') dp[i] += dp[i - 1];
      //2個字符
        int tmp = (s[i - 2] - '0') * 10 + (s[i - 1] - '0');
        if(tmp >= 10 && tmp <= 26) dp[i] += dp[i - 2];
     }
      return dp[n];
    }
};

不同路徑

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

  1. dp[i] [j]:走到 i,j 位置有多少種方式
  2. dp[i] [j] = dp[i] [j - 1] + dp[i - 1] [j];
  3. 初始化:新增加一列和一行
  4. 填表順序:從上到下,左到右填表
  5. 返回值:dp[m] [n]

代碼

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m+1, vector<int>(n+1));
        //初始化
        dp[0][1] = 1;
        for(int i = 1; i <= m; i++)
        {
          for(int j = 1; j <= n; j++)
          {
            dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
          }
        }
        return dp[m][n];
    }
};

不同路徑 II

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

  1. dp [i] [j] : 到達i,j這個位置有多少種方法
  2. dp [i] [j] = dp[i - 1] [j] + dp [i] [j - 1]
  3. 初始化:dp[1] [0] = 1;
  4. 填表順序:從上到下,從左到右
  5. 返回值: dp[m] [n]

代碼

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
          int m = obstacleGrid.size(), n = obstacleGrid[0].size();
          vector<vector<int>> dp(m + 1, vector<int>(n + 1));
          //初始化
          dp[1][0] = 1;
          for(int i = 1; i <= m; i++)
          {
            for(int j = 1; j <= n; j++)
            {
              if(obstacleGrid[i - 1][j - 1] != 1)
              dp[i][j] = dp[i - 1][j] + dp[i][j -1];
            }

          }
          return dp[m][n];
    } 
};

珠寶的最高價值

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

  1. dp [i] [j] : 到達i,j這個位置的最高價值
  2. dp [i] [j] =max(dp[i-1] [j], dp[i] [j-1]) + frame[i-1] [j-1];
  3. 初始化:默認都是0不用初始化
  4. 填表順序:從上到下,從左到右
  5. 返回值: dp[m] [n]

代碼

class Solution {
public:
    int jewelleryValue(vector<vector<int>>& frame) {
        int m = frame.size(), n = frame[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        for(int i = 1; i <= m; i++)
          for(int j = 1; j <= n; j++)
          {           
            dp[i][j] =  max(dp[i-1][j], dp[i][j-1]) + frame[i-1][j-1];
          }
        return dp[m][n];
    }
};

下降路徑最小和

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

  1. dp[i] [j] : 到達i,j位置的最小下路徑
  2. dp[i] [j] : min(dp[i+1] [j-1], dp[i+1] [j+1], dp[i+1] [j]) + matrix[i-1] [j - 1]
  3. 初始化:多給1行 和2列
  4. 填表順序:從上到下,從左到右
  5. 返回值: 最后一行的最小值

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

代碼

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
     int n = matrix.size();
     vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));
      for(int j = 0; j < n + 2; j++) dp[0][j] = 0;
      for(int i = 1; i <= n; i++)
      {
         for(int j = 1; j <= n; j++)
        {
          dp[i][j] = min(min(dp[i-1][j-1], dp[i-1][j]), dp[i-1][j+1]) + matrix[i-1][j-1];
        }
      
      }      
      //返回值
      int ret = INT_MAX;
      for(int j = 1; j <= n; j++)
      {
        ret = min(ret, dp[n][j]);
      }
      return ret;
    }
};

最小路徑和

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

代碼

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
        dp[1][0] = dp[0][1] = 0; 
        for(int i = 1; i <= m; i++)
          for(int j = 1; j <= n; j++)
          {
            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i - 1][j - 1];
          }
        
      return dp[m][n];
    }
};

地下城游戲(反著來)

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

題目分析

刷題之動態(tài)規(guī)劃-路徑問題,刷題,動態(tài)規(guī)劃,算法

  1. dp[i] [j] : 從i,j位置出發(fā),到達終點所需要的最低

  2. dp[i] [j] = min(dp[i] [j + 1], dp[i + 1] [j]) - dungeon[i] [j];

  3. 初始化 dp[m +1] [n -1] = dp [m - 1] [n + 1] = 1;

  4. 填表順序:從下到上,從右到左

  5. 返回值: dp[0] [0]

代碼

class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
      int m = dungeon.size(), n = dungeon[0].size();
      vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
      //初始化
      dp[m][n -1] = dp [m - 1][n] = 1;
      for(int i = m - 1; i >= 0; i--)
        for(int j = n - 1; j >= 0; j--)
        {
          dp[i][j] = min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j];
          dp[i][j] = max(1, dp[i][j]); //如果血包很大,會出現(xiàn)負數(shù),這里取1就是最低血
          
        }
        return dp[0][0];
    }
};

到了這里,關(guān)于刷題之動態(tài)規(guī)劃-路徑問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【算法專題】動態(tài)規(guī)劃之路徑問題

    【算法專題】動態(tài)規(guī)劃之路徑問題

    題目鏈接 - Leetcode -62.不同路徑 Leetcode -62.不同路徑 題目:一個機器人位于一個 m x n 網(wǎng)格的左上角 (起始點在下圖中標(biāo)記為 “Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網(wǎng)格的右下角(在下圖中標(biāo)記為 “Finish” )。 問總共有多少條不同的路徑? 示

    2024年01月24日
    瀏覽(25)
  • 算法沉淀 —— 動態(tài)規(guī)劃篇(路徑問題)

    算法沉淀 —— 動態(tài)規(guī)劃篇(路徑問題)

    幾乎所有的動態(tài)規(guī)劃問題大致可分為以下5個步驟,后續(xù)所有問題分析都將基于此 1.、狀態(tài)表示:通常狀態(tài)表示分為基本分為以下兩種,其中更是以第一種為甚。 以i為結(jié)尾 ,dp[i] 表示什么,通常為代求問題(具體依題目而定) 以i為開始 ,dp[i]表示什么,通常為代求問題(具

    2024年04月17日
    瀏覽(21)
  • 【算法】動態(tài)規(guī)劃中的路徑問題

    【算法】動態(tài)規(guī)劃中的路徑問題

    君兮_的個人主頁 即使走的再遠,也勿忘啟程時的初心 C/C++ 游戲開發(fā) Hello,米娜桑們,這里是君兮_,如果給算法的難度和復(fù)雜度排一個排名,那么動態(tài)規(guī)劃算法一定名列前茅。今天,我們通過由簡單到困難的兩道題目帶大家學(xué)會動態(tài)規(guī)劃中的路徑問題 好了廢話不多說,開始我

    2024年02月05日
    瀏覽(23)
  • C++算法 —— 動態(tài)規(guī)劃(2)路徑問題

    C++算法 —— 動態(tài)規(guī)劃(2)路徑問題

    每一種算法都最好看完第一篇再去找要看的博客,因為這樣會幫你梳理好思路,看接下來的博客也就更輕松了。當(dāng)然,我也會盡量在寫每一篇時都可以讓不懂這個算法的人也能邊看邊理解。 動規(guī)的思路有五個步驟,且最好畫圖來理解細節(jié),不要怕麻煩。當(dāng)你開始畫圖,仔細閱

    2024年02月06日
    瀏覽(20)
  • 【算法優(yōu)選】 動態(tài)規(guī)劃之路徑問題——貳

    【算法優(yōu)選】 動態(tài)規(guī)劃之路徑問題——貳

    動態(tài)規(guī)劃相關(guān)題目都可以參考以下五個步驟進行解答: 狀態(tài)表? 狀態(tài)轉(zhuǎn)移?程 初始化 填表順序 返回值 后面題的解答思路也將按照這五個步驟進行講解。 給你一個 n x n 的 方形 整數(shù)數(shù)組 matrix ,請你找出并返回通過 matrix 的下降路徑 的 最小和 。 下降路徑 可以從第一行中的

    2024年02月05日
    瀏覽(25)
  • 基礎(chǔ)算法之——【動態(tài)規(guī)劃之路徑問題】1

    基礎(chǔ)算法之——【動態(tài)規(guī)劃之路徑問題】1

    今天更新動態(tài)規(guī)劃路徑問題1,后續(xù)會繼續(xù)更新其他有關(guān)動態(tài)規(guī)劃的問題!動態(tài)規(guī)劃的路徑問題,顧名思義,就是和路徑相關(guān)的問題。當(dāng)然,我們是從最簡單的找路徑開始! 動態(tài)規(guī)劃的使用方法: 1.確定狀態(tài)并定義狀態(tài)數(shù)組:(i,j)代表什么意思?dp[i][j]又是什么意思? 2.確

    2024年02月07日
    瀏覽(20)
  • 【算法日志】動態(tài)規(guī)劃刷題:01背包問題,多重背包問題(day37,day38)

    【算法日志】動態(tài)規(guī)劃刷題:01背包問題,多重背包問題(day37,day38)

    目錄 前言 目標(biāo)和(01背包) 一和零(01背包) 零錢兌換(多重背包) 排列總和(多重背包) 這兩天都是背包問題,其中的01背包的一些應(yīng)用問題需要一定的數(shù)學(xué)建模能力,需要i將實際問題簡化成我們熟悉的背包問題;而這兩天的多重背包問題還算比較基礎(chǔ),但也要我明白了

    2024年02月11日
    瀏覽(95)
  • 力扣算法刷題Day42|動態(tài)規(guī)劃:01背包問題 分割等和子集

    力扣題目:01背包問題(二維數(shù)組) 刷題時長:參考題解 解題方法:動態(tài)規(guī)劃 +?二維dp數(shù)組 復(fù)雜度分析 時間 空間 問題總結(jié) 理解遞推公式困難 本題收獲 動規(guī)思路:兩層for循環(huán),第一層i遍歷物品,第二層j枚舉背包容量以內(nèi)所有值 確定dp數(shù)組及下標(biāo)的含義:dp[i][j] 表示從下標(biāo)

    2024年02月13日
    瀏覽(94)
  • 力扣算法刷題Day44|動態(tài)規(guī)劃:完全背包問題 零錢兌換II 組合總和Ⅳ

    力扣題目:#518.零錢兌換II(完全背包組合問題) 刷題時長:7min 解題方法:動態(tài)規(guī)劃(完全背包) 復(fù)雜度分析 時間復(fù)雜度: O(mn),其中 m 是amount,n 是 coins 的長度 空間復(fù)雜度: O(m) 問題總結(jié) 對遞推公式的理解 本題收獲 題意轉(zhuǎn)換:純完全背包是湊成背包最大價值是多少,而本

    2024年02月13日
    瀏覽(27)
  • 【動態(tài)規(guī)劃刷題 5】 最小路徑和&&地下城游戲

    【動態(tài)規(guī)劃刷題 5】 最小路徑和&&地下城游戲

    鏈接: 64. 最小路徑和 給定一個包含非負整數(shù)的 m x n 網(wǎng)格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。 說明:每次只能向下或者向右移動一步。 輸入:grid = [[1,3,1],[1,5,1],[4,2,1]] 輸出:7 解釋:因為路徑 1→3→1→1→1 的總和最小。 示例 2: 輸入

    2024年02月13日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包