Skip to content
Rain Hu's Workspace
Go back

[LeetCode] 931. Minimum Falling Path Sum

Rain Hu

931. Minimum Falling Path Sum


一、題目

Given an n x n array of integers matrix, return the minimum sum of any falling path through matrix.
A falling path starts at any element in the first row and chooses the element in the next row that is either directly below or diagonally left/right. Specifically, the next element from position (row, col) will be (row + 1, col - 1), (row + 1, col), or (row + 1, col + 1).

Example 1:
falling1-grid

falling2-grid Example 2:

Constraints:


二、分析

三、解題

1. DP

int minFallingPathSum(vector<vector<int>>& matrix) {
    int m = matrix.size(), n = matrix[0].size();
    if (m == 1) return matrix[0][0];
    vector<vector<int>> dp(m+1, vector<int>(n));
    for (int i = 0; i < m; i++) {
        vector<int>& row = matrix[i];
        dp[i+1][0] = min(dp[i][0], dp[i][1]) + row[0];
        dp[i+1][n-1] = min(dp[i][n-1], dp[i][n-2]) + row[n-1];
        for (int j = 1; j < n-1; j++) {
            dp[i+1][j] = min({dp[i][j-1], dp[i][j], dp[i][j+1]}) + row[j];
        }
    }
    int res = INT_MAX;
    for (int j = 0; j < n; j++) {
        res = min(res, dp[m][j]);
    }
    return res;
}

2. DP space-optimized

int minFallingPathSum(vector<vector<int>>& matrix) {
    int m = matrix.size(), n = matrix[0].size();
    if (m == 1) return matrix[0][0];
    // 利用奇數層跟偶數層做切換
    vector<vector<int>> dp(2, vector<int>(n));
    for (int i = 0; i < m-1; i++) {
        vector<int>& row = matrix[i];
        dp[i%2][0] = min(dp[(i+1)%2][0], dp[(i+1)%2][1]) + row[0];
        dp[i%2][n-1] = min(dp[(i+1)%2][n-1], dp[(i+1)%2][n-2]) + row[n-1];
        for (int j = 1; j < matrix[0].size()-1; j++) {
            dp[i%2][j] = min({dp[(i+1)%2][j-1], dp[(i+1)%2][j], dp[(i+1)%2][j+1]}) + row[j];
        }
    }
    int res = INT_MAX;
    dp[(m-1)%2][0] = min(dp[m%2][0], dp[m%2][1]) + matrix[m-1][0];
    dp[(m-1)%2][n-1] = min(dp[m%2][n-1], dp[m%2][n-2]) + matrix[m-1][n-1];
    res = min({res, dp[(m-1)%2][0], dp[(m-1)%2][n-1]});
    for (int j = 1; j < matrix[0].size()-1; j++) {
        dp[(m-1)%2][j] = min({dp[m%2][j-1], dp[m%2][j], dp[m%2][j+1]}) + matrix[m-1][j];
        res = min(res, dp[(m-1)%2][j]);
    }
    return res;
}

回目錄 Catalog


Share this post on:

Previous
[LeetCode] 24. Swap Nodes in Pairs
Next
[LeetCode] 70. Climbing Stairs