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차원 배열이 주어졌을 때 첫 번째 행부터 마지막 ​​행까지의 경로와 최소값을 반환

간단하고 직접적인 방법은 모든 경로 합계를 찾은 다음 모든 경로 합계에서 최소값을 찾아 반환하는 것입니다.

위와 같은 문제는 깊이 우선 탐색 과정인 재귀를 이용하여 해결할 수 있다. 아래에서 위로 최종 반환 값은 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