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) 最後に、最後の行の最小値を返します。これは、降順パスの最小合計です。