【leetcode-62,63,64 動態規劃】 不一樣路徑,最小路徑和

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和爲最小。css

說明:每次只能向下或者向右移動一步。數組

示例:spa

輸入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
輸出: 7
解釋: 由於路徑 1→3→1→1→1 的總和最小。

 

基礎的動態規劃問題,適合理解動態規範的想法code

沒有像以前設一個行和列+1的數組,這樣更直觀些不容易犯錯blog

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length; //行數
        int n = grid[0].length; //列數
        int[][] dp = new int[m][n];
        //初始化第一行和第一列
        dp[0][0] = grid[0][0];
        for (int i=1;i<n;i++) {
            dp[0][i] = dp[0][i-1] + grid[0][i];
        }
        for (int i=1;i<m;i++) {
            dp[i][0] = dp[i-1][0] +grid[i][0];
        }
        for (int i=1;i<m;i++) {
            for (int j=1;j<n;j++) {
                dp[i][j] = grid[i][j] + Math.min(dp[i-1][j],dp[i][j-1]);
            }
        }

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

 

【leetcode-62 動態規劃】 不一樣路徑

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲「Start」 )。leetcode

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲「Finish」)。it

問總共有多少條不一樣的路徑?io

 

例如,上圖是一個7 x 3 的網格。有多少可能的路徑?class

說明:m 和 的值均不超過 100。基礎

示例 1:

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑能夠到達右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

示例 2:

輸入: m = 7, n = 3
輸出: 28


與上題相似,基礎
個人:
class Solution {
    public int uniquePaths(int m,int n) {

        int[][] dp = new int[m][n];
        //初始化第一行和第一列
        dp[0][0] = 1;
        for (int i=1;i<n;i++) {
            dp[0][i] = 1;
        }
        for (int i=1;i<m;i++) {
            dp[i][0] = 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-1][n-1];
    }
}

 

 

63. 不一樣路徑 II

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲「Start」 )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲「Finish」)。

如今考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不一樣的路徑?

網格中的障礙物和空位置分別用 1 和 0 來表示。

說明:m 和 的值均不超過 100。

示例 1:

輸入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
輸出: 2
解釋:
3x3 網格的正中間有一個障礙物。
從左上角到右下角一共有  條不一樣的路徑:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右2
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];
        //初始化第一行和第一列
        if (obstacleGrid[0][0] == 1) {
            dp[0][0] = 0;
        } else {
            dp[0][0] = 1;
        }
        for (int i=1;i<n;i++) {
            if (obstacleGrid[0][i] == 1)
                dp[0][i] = 0;
            else
            dp[0][i] = dp[0][i-1];
        }
        for (int i=1;i<m;i++) {
            if (obstacleGrid[i][0] == 1)
                dp[i][0] = 0;
            else
                dp[i][0] = dp[i-1][0];
        }
        for (int i=1;i<m;i++) {
            for (int j=1;j<n;j++) {
                if (obstacleGrid[i][j] == 1) {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        return dp[m-1][n-1];
    }
相關文章
相關標籤/搜索