動態規劃-網格非降路徑

leetcode 64.最小路徑和

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

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

示例

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

代碼

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

    }
};

leetcode931. 下降路徑最小和

題目

給定一個方形整數數組 A,我們想要得到通過 A 的下降路徑的最小和。

下降路徑可以從第一行中的任何元素開始,並從每一行中選擇一個元素。在下一行選擇的元素和當前行所選元素最多相隔一列。

示例

輸入:[[1,2,3],[4,5,6],[7,8,9]]
輸出:12
解釋:
可能的下降路徑有:
	+ [1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
	+ [2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
	+ [3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]
和最小的下降路徑是 [1,4,7],所以答案是 12。

代碼

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& A) {
        if(A.size() == 0 || A[0].size() == 0) return 0;
        int leni = A.size(), lenj = A[0].size();
        vector<vector<int>> dp(leni, vector<int>(lenj));

        for(int j = lenj-1; j >= 0; j--)dp[leni-1][j] = A[leni-1][j];
        
        for(int i = leni - 2; i >= 0; i--){
            for(int j = lenj-1; j >= 0; j--){
                if(j == 0){
                    dp[i][j] = min(dp[i+1][j],dp[i+1][j+1]) + A[i][j];
                }
                else if(j == lenj -1){
                    dp[i][j] = min(dp[i+1][j-1], dp[i+1][j]) + A[i][j];
                }else{
                    dp[i][j] = min(dp[i+1][j-1],min(dp[i+1][j],dp[i+1][j+1])) + A[i][j];
                }
            }
        }
        int res = INT_MAX;
        for(int j = 0; j < lenj; j++) res = min(res, dp[0][j]);
        return res;
    }
};



leetcode 1289. 下降路徑最小和 II

題目
給你一個整數方陣 arr ,定義「非零偏移下降路徑」爲:從 arr 數組中的每一行選擇一個數字,且按順序選出來的數字中,相鄰數字不在原數組的同一列。

請你返回非零偏移下降路徑數字和的最小值。

示例

輸入:arr = [[1,2,3],[4,5,6],[7,8,9]]
輸出:13
解釋:
所有非零偏移下降路徑包括:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]
下降路徑中數字和最小的是 [1,5,7] ,所以答案是 13 。

代碼

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& arr) {
        int leni = arr.size(), lenj = arr[0].size();
        if(leni == 0 || lenj == 0) return 0;
        vector<vector<int>> dp(leni, vector<int>(lenj));
        for(int j = lenj-1; j >= 0; j--)dp[leni-1][j] = arr[leni-1][j];

        for(int i = leni - 2; i >= 0; i--){
            for(int j = lenj-1; j >= 0; j--){
                int res = INT_MAX;
                for(int k = lenj-1; k >= 0; k--){
                    if(k == j) continue;
                    else{
                        res = min(res, dp[i+1][k]);
                    } 
                    dp[i][j] = res + arr[i][j];
                }
            }
        }
        int res = INT_MAX;
        for(int j = 0; j < lenj; j++) res = min(res, dp[0][j]);
        return res;
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章