2023-07-13 LeetCode の毎日の質問 (下降パスの最小合計)

2023-07-13 1 日 1 つの質問

1. トピック番号

931. 下降路径最小和

2. トピックリンク

クリックするとトピックの場所にジャンプします

3. トピックの説明

nxn の正方整数配列行列が与えられた場合、行列を通る降順パス最小合計を見つけて返してください。

降順パスは、最初の行の任意の要素から開始し、各行から要素を選択できます。次の行で選択される要素は、現在の行で選択されている要素から最大 1 列離れています (つまり、真下または左または右の斜めの最初の要素)。具体的には、位置 (row,col) の次の要素は (row + 1,col - 1)、(row + 1,col)、または (row + 1,col + 1) である必要があります。

ヒント:

  • n == 行列.長さ == 行列[i].長さ
  • 1 <= n <= 100
  • -100 <= 行列[i][j] <= 100

4. 問題解決コード

class Solution {
    
    
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
    
    
        int m = matrix.size();
        int n = matrix[0].size();
        int dp[m+1][n+1];
        memset(dp, 0, sizeof(dp));
        for(int i = 0; i < m; ++i){
    
    
            for(int j = 0; j < n; ++j){
    
    
                dp[i][j] = INT_MAX;
            }
        }
        for(int i = 0; i < m; ++i){
    
    
            for(int j = 0; j < n; ++j){
    
    
                if(i == 0){
    
    
                    dp[i][j] = matrix[i][j];
                    continue;
                }
                if(j - 1 >= 0){
    
    
                    dp[i][j] = min(dp[i][j], matrix[i][j] + dp[i-1][j-1]);    
                }
                dp[i][j] = min(dp[i][j], matrix[i][j] + dp[i-1][j]);
                if(j + 1 < n){
    
    
                    dp[i][j] = min(dp[i][j], matrix[i][j] + dp[i-1][j+1]);
                }
            }
        }
        int min0 = INT_MAX;
        for(int i = 0; i < n; ++i){
    
    
            min0 = min(min0, dp[m-1][i]);
        }
    return min0;
    }
};

5、問題解決のアイデア

(1) このトピックでは、動的計画アルゴリズムを使用して問題を解決します。

(2) まず状態を設定します。dp[i][j] は(i, j) 位置への下降パス最小合計を表します。初期状態を定義します。最初の行のすべての下降パス最小合計が、対応する行列の値になります。

(3) タイトルには各状態がどのように遷移するかが示されており、状態遷移はタイトルのプロンプトに従って実行され、再帰的に実行できます。

(4) 最後に、最後の行の最小値を返します。これは、降順パス最小合計です。

おすすめ

転載: blog.csdn.net/qq_56086076/article/details/131693906