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

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

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


1. 不同路徑(62)

題目描述:
動態(tài)規(guī)劃-路徑問題,動態(tài)規(guī)劃,算法,leetcode
狀態(tài)表示:
設dp[i][j]表示到達(i,j)位置時的路徑數(shù)目。
狀態(tài)轉移方程:
dp[i][j]=dp[i-1][j]+dp[i][j-1]。這里分析起來很簡單,因為這算是很經典的問題了。機器人只能向下或者向右走,所以到達(i,j)就有兩種方式,分別是從(i-1,j)向下以及(i,j-1)向右,那么到達(i,j)位置的路徑數(shù)只需要將到達(i-1,j)以及(i,j-1)位置的路徑數(shù)相加即可。
初始化:
初始化就是為了避免越界問題,因為這里的狀態(tài)轉移方程涉及到i-1以及j-1。這里可以在矩陣外添加一行和一列,至于對于一行和一列的初始化要注意不能影響最終輸出的結果,另外這樣初始化還要注意下標的映射關系,這東西講不清具體得看代碼,這樣初始化的好處就是可以將一整個矩陣全寫進循環(huán)。
填表順序:
從上到下,從左至右。
返回值:
因為添加了一行一列所以返回dp[m][n]。
代碼如下:

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m + 1][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 - 1][j] + dp[i][j - 1];
            }
        }

        return dp[m][n];


    }
}

題目鏈接
時間復雜度:O(n^2)
空間復雜度:O(n^2)

2. 不同路徑 II(63)

題目描述:
動態(tài)規(guī)劃-路徑問題,動態(tài)規(guī)劃,算法,leetcode
狀態(tài)表示:
和上一題一樣(i,j)位置的路徑數(shù)為dp[i][j]。
狀態(tài)轉移方程:
實際上這題的狀態(tài)轉移方程也非常類似于上一題,但是要考慮一個特殊情況,就是障礙的情況。當(i,j)是障礙物的情況下直接將dp[i][j]=0,當(i,j)不是障礙物的情況下dp[i][j]=dp[i-1][j]+dp[i][j-1]。
初始化:
這里的初始化和上一題是一致的額,沒什么好說的。。但是要提前判斷左上角為障礙物的情況,直接返回0。
填表順序:
從上往下,從左至右。
返回值:
與上題一致也是返回dp[m][n]。
代碼如下:

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;

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

        dp[0][1] = 1;
        if (obstacleGrid[0][0] == 1) {
            return 0;
        }

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (obstacleGrid[i - 1][j - 1] == 1) {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }

        return dp[m][n];

    }
}

題目鏈接
時間復雜度:O(n^2)
空間復雜度:O(n^2)

3. 珠寶的最高價值(LCR 166)

題目描述:
動態(tài)規(guī)劃-路徑問題,動態(tài)規(guī)劃,算法,leetcode
狀態(tài)表示:
這題與上面兩題也是相似的,只不過給出的矩陣多出了一個值的屬性,說白了這篇博客就是將路徑問題進行的一個分類總結。這題的狀態(tài)表示根據(jù)經驗和題目要求可以設置為dp[i][j]表示在(i,j)位置能夠拿到的最大珠寶價值。
狀態(tài)轉移方程:
到達(i,j)位置還是只能夠從(i-1,j)以及(i,j-1),因此要得到(i,j)位置的最大價值首先要將dp[i-1][j]與dp[i][j-1]的價值進行比較得到最大值賦給dp[i][j],狀態(tài)轉移方程為dp[i][j]=max(dp[i-1][j],dp[i][j-1])+frame[i][j]。
初始化:
還是類似加上一行和一列,但是這里不用做別的操作了,行和列賦0即可。但是還要注意dp數(shù)組與frame數(shù)組的映射關系。
填表順序:
從上到下,從左至右。
返回值:
dp[m][n]。
代碼如下:

class Solution {
    public int jewelleryValue(int[][] frame) {
        int m = frame.length;
        int n = frame[0].length;

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

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + frame[i - 1][j - 1];
            }
        }

        return dp[m][n];
    }
}

題目鏈接
時間復雜度:O(n^2)
空間復雜度:O(n^2)

4. 下降路徑最小和(931)

題目描述:
動態(tài)規(guī)劃-路徑問題,動態(tài)規(guī)劃,算法,leetcode
狀態(tài)表示:
根據(jù)經驗加題目要求可以將dp[i][j]定義為到達(i,j)位置的最小路徑和。
狀態(tài)轉移方程:
(i,j)上一行相鄰的位置有(i-1,j)(i-1,j-1)(i-1,j+1),因此要求得到達(i,j)位置的最小路徑和就可以列出以下狀態(tài)轉移方程,dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+ matrix[i][j]。
初始化:
要避免到達(i,j)位置的前三個位置越界可以在矩陣上加上左右兩邊的兩列以及上邊的一行,從而方便后續(xù)的操作,這里為了避免加上的空間影響最終得到的結果要注意把加上的一行賦值為0,加上的兩列賦值為無窮大。
填表順序:
從上到下,從左至右。
返回值:
要返回矩陣最后一行的最小值。
代碼如下:

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;

        int[][] dp = new int[m + 1][n + 2];

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

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

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1], dp[i - 1][j + 1])) + matrix[i - 1][j - 1];
            }
        }

        int min = Integer.MAX_VALUE;
        for (int i = 1; i <= n; i++) {
            if (min > dp[m][i]) {
                min = dp[m][i];
            }
        }

        return min;
    }
}

題目鏈接
時間復雜度:O(n^2)
空間復雜度:O(n^2)

5. 最小路徑和(64)

題目描述:
動態(tài)規(guī)劃-路徑問題,動態(tài)規(guī)劃,算法,leetcode
狀態(tài)表示:
經驗加題目要求,設定dp[i][j]表示到達(i,j)位置的最小路徑和。
狀態(tài)轉移方程:
因為只能向下以及向右移動,所以dp[i][j]的值關聯(lián)于dp[i-1][j]以及dp[i][j-1],即dp[i][j]=min(dp[i][j-1],dp[i-1][j])+grid[i][j]。
初始化:
也是一樣為了避免越界,要給dp加上一行和一列的空間,這里要考慮到不能影響到最終的結果,因此除了左上角的左邊和上邊的空間其余空間都賦為無窮大。
填表順序:
從上到下,從左至右。
返回值:
因為增加了一行和一列,所以應該返回dp[m][n]。
代碼如下:

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;

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

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

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

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
            }
        }

        return dp[m][n];
    }
}

題目鏈接
時間復雜度:O(n^2)
空間復雜度:O(n^2)

6. 地下城游戲(174)

題目描述:
動態(tài)規(guī)劃-路徑問題,動態(tài)規(guī)劃,算法,leetcode
狀態(tài)表示:
根據(jù)經驗以及題目要求這題定義dp[i][j]為以(i,j)為起點到達終點所需的最小點數(shù)。
狀態(tài)轉移方程:
根據(jù)經驗與題目要求dp[i][j]定義為以位置(i,j)為起點營救公主所需的最低血量。因此位置(i,j)和其下邊以及右邊的dp元素的關系如下:
dp[i][j]+dungeon[i][j]>=dp[i+1][j]。
dp[i][j]+dungeon[i][j]>=dp[i][j+1]。
要滿足以上條件,皆取最小值,即dp[i][j]=min(dp[i+1][j]-dungeon[i][j],dp[i][j+1]-dungeon[i][j]),不過要注意一個問題,當dungeon[i][j]的值是一個很大的值即一個很大的血包的時候,dp[i][j]就為負值了,要避免這種情況,如果出現(xiàn)血包很大的情況就將dp[i][j]直接賦為1即可,因為1就是邏輯上合理的最低血量。
初始化:
為了避免越界也要在dp上再多加一行和一列,這里的行和列是加在最后一行和最后一列。為了使添加之后不影響輸出的結果,所以在行和列的每一個空間賦無窮大,只有右下角公主所在的位置的右邊和下邊賦為1,因為在邏輯上當營救完公主之后血量至少為1。
填表順序:
從下到上,從右至左。
返回值:
dp[0][0]。
代碼如下:

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        int m = dungeon.length;
        int n = dungeon[0].length;

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

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

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

        dp[m][n - 1] = 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] = Math.min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];
                dp[i][j] = Math.max(1, dp[i][j]);
            }
        }

        return dp[0][0];

    }
}

題目鏈接
時間復雜度:O(n^2)
空間復雜度:O(n^2)文章來源地址http://www.zghlxwxcb.cn/news/detail-853881.html

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

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

領支付寶紅包贊助服務器費用

相關文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月07日
    瀏覽(20)
  • 動態(tài)規(guī)劃 Leetcode 62 不同路徑

    Leetcode 62 學習記錄自代碼隨想錄 要點:1.二維表格,想到(i,j)去代表其坐標,dp數(shù)組也因此為二維數(shù)組; 2.遞推公式 d p [ i ] [ j ] dp[i][j] d p [ i ] [ j ] 的上一步只能是其左邊或上邊,所以 d p [ i ] [ j ] = d p [ i ? 1 ] [ j ] + d p [ i ] [ j ? 1 ] dp[i][j]=dp[i-1][j]+dp[i][j-1] d p [ i ] [ j ] =

    2024年03月13日
    瀏覽(29)
  • 【手撕算法|動態(tài)規(guī)劃系列No.2】leetcode面試題 08.01. 三步問題

    【手撕算法|動態(tài)規(guī)劃系列No.2】leetcode面試題 08.01. 三步問題

    個人主頁:平行線也會相交 歡迎 點贊?? 收藏? 留言? 加關注??本文由 平行線也會相交 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時,記錄一下自己的學習過程,希望對大家有所幫助 ??希望我們一起努力、成長,共同進步。

    2024年02月12日
    瀏覽(19)
  • leetcode63. 不同路徑 II(動態(tài)規(guī)劃-java)

    leetcode63. 不同路徑 II(動態(tài)規(guī)劃-java)

    來源:力扣(LeetCode) 鏈接:https://leetcode.cn/problems/unique-paths-ii 一個機器人位于一個 m x n 網格的左上角 (起始點在下圖中標記為 “Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish”)。 現(xiàn)在考慮網格中有障礙物。

    2024年02月11日
    瀏覽(24)
  • LeetCode刷題筆記【30】:動態(tài)規(guī)劃專題-2(不同路徑、不同路徑 II)

    LeetCode刷題筆記【30】:動態(tài)規(guī)劃專題-2(不同路徑、不同路徑 II)

    參考前文 參考文章: LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯) LeetCode鏈接:https://leetcode.cn/problems/unique-paths/description/ 動態(tài)規(guī)劃 : 創(chuàng)建m×n的數(shù)組, 對應這個地圖, 數(shù)組 val 表示 有幾種方法可以走到這一格 最開始, 第一行和第一列v

    2024年02月09日
    瀏覽(49)
  • 【LeetCode:64. 最小路徑和 | 暴力遞歸=>記憶化搜索=>動態(tài)規(guī)劃 】

    【LeetCode:64. 最小路徑和 | 暴力遞歸=>記憶化搜索=>動態(tài)規(guī)劃 】

    ?? 算法題 ?? ?? 算法刷題專欄 | 面試必備算法 | 面試高頻算法 ?? ?? 越難的東西,越要努力堅持,因為它具有很高的價值,算法就是這樣? ?? 作者簡介:碩風和煒,CSDN-Java領域新星創(chuàng)作者??,保研|國家獎學金|高中學習JAVA|大學完善JAVA開發(fā)技術棧|面試刷題|面經八股文

    2024年02月05日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包