LeetCode・毎日の問題・931.降下経路の最小和・記憶検索

著者: Xiao Xun
リンク: https://leetcode.cn/problems/minimum-falling-path-sum/solutions/2341965/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-3n58v/
出典: LeetCode の
著作権は作者に帰属します。商業的転載の場合は著者に連絡して承認を求め、非商業的転載の場合は出典を明記してください。

トピック

 

 

一連の考え

タイトル -> 2次元配列を指定して、最初の行から最後の行までのパスと最小値を返します。

単純かつ直接的な方法は、すべてのパスの合計を見つけてから、すべてのパスの合計から最小値を見つけて返すことです。

上記の問題は、深さ優先探索プロセスである再帰を使用することで解決できます。各位置に対して、次のステップのメソッドが 3 つあり、そのたびに 3 つのメソッドの最小値が返され、その最小値がスクリーニングされます。下から上へ、最終的な戻り値は min でなければなりません。すべての開始位置を列挙し、最小値を取得します。

int dfs(int **matrix, int n, int m, int i, int j)
{
    if (j < 0 || j >= m) return INT_MAX;
    if (i == n-1) return  matrix[i][j];
    int left = INT_MAX, mid = INT_MAX, right = INT_MAX;
    left = dfs(matrix, n, m, i + 1, j - 1);
    mid = dfs(matrix, n, m, i + 1, j);
    right = dfs(matrix, n, m, i + 1, j + 1);
    return fmin(fmin(left, mid), right) + matrix[i][j];
}

開始位置が異なる場合、中間距離には同じ場所が多数あり、上記の方法でも中間の繰り返し場所が再帰的に列挙され、多くの繰り返し計算が行われます。配列を使用して移動した経路を記録できます。次回到着 配列レコードの値を現在位置に直接返します。上記の方法はメモリ検索です。

コードコメントは非常に詳細です

コード


int dfs(int **matrix, int n, int m, int i, int j, int (*ans)[m])
{
    if (j < 0 || j >= m) return INT_MAX;//越界无效值
    if (ans[i][j] != INT_MAX) return ans[i][j];//重复路径
    if (i == n-1) return matrix[i][j];//底部返回
    int left = INT_MAX, mid = INT_MAX, right = INT_MAX;
    left = dfs(matrix, n, m, i + 1, j - 1, ans);//左边路径
    mid = dfs(matrix, n, m, i + 1, j,  ans);//中间路径
    right = dfs(matrix, n, m, i + 1, j + 1, ans);//右边路径
    //保存当前位置路径最小值,记忆化保存
    ans[i][j] = fmin(fmin(left, mid), right) + matrix[i][j];
    return  ans[i][j];
}
int minFallingPathSum(int** matrix, int matrixSize, int* matrixColSize){
    int min = INT_MAX;
    int n = matrixSize, m = matrixColSize[0];
    int ans[n][m];
    for (int i = 0; i < n; ++i) {//记忆化数组初始化
        for (int j = 0; j < m; ++j) {
            ans[i][j] = INT_MAX;
        }
    } 
    for (int i = 0; i < m; ++i) {//枚举每一个起点位置
        int sum = dfs(matrix, n, m, 0, i, ans);
        min = fmin(min, sum);//保存最小值路径
    }
    return min;
}

作者:小迅
链接:https://leetcode.cn/problems/minimum-falling-path-sum/solutions/2341965/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-3n58v/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

おすすめ

転載: blog.csdn.net/m0_64560763/article/details/131696238