Minimum Falling Path Sum

medium array dp matrix

Problem

Given an n×n grid, return the minimum sum of any falling path. From cell (r, c) you may step to (r+1, c-1), (r+1, c), or (r+1, c+1).

Inputmatrix = [[2,1,3],[6,5,4],[7,8,9]]
Output13
DP from the top: dp[r][c] = matrix[r][c] + min(dp[r-1][c-1..c+1]).

def minFallingPathSum(matrix):
    n = len(matrix)
    dp = [row[:] for row in matrix]
    for r in range(1, n):
        for c in range(n):
            best = dp[r - 1][c]
            if c > 0: best = min(best, dp[r - 1][c - 1])
            if c < n - 1: best = min(best, dp[r - 1][c + 1])
            dp[r][c] += best
    return min(dp[-1])
function minFallingPathSum(matrix) {
  const n = matrix.length;
  const dp = matrix.map(r => r.slice());
  for (let r = 1; r < n; r++) {
    for (let c = 0; c < n; c++) {
      let best = dp[r - 1][c];
      if (c > 0) best = Math.min(best, dp[r - 1][c - 1]);
      if (c < n - 1) best = Math.min(best, dp[r - 1][c + 1]);
      dp[r][c] += best;
    }
  }
  return Math.min(...dp[n - 1]);
}
class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int n = matrix.length;
        int[][] dp = new int[n][n];
        for (int i = 0; i < n; i++) dp[i] = matrix[i].clone();
        for (int r = 1; r < n; r++) {
            for (int c = 0; c < n; c++) {
                int best = dp[r - 1][c];
                if (c > 0) best = Math.min(best, dp[r - 1][c - 1]);
                if (c < n - 1) best = Math.min(best, dp[r - 1][c + 1]);
                dp[r][c] += best;
            }
        }
        int ans = Integer.MAX_VALUE;
        for (int v : dp[n - 1]) ans = Math.min(ans, v);
        return ans;
    }
}
int minFallingPathSum(vector<vector<int>>& matrix) {
    int n = (int)matrix.size();
    auto dp = matrix;
    for (int r = 1; r < n; r++) {
        for (int c = 0; c < n; c++) {
            int best = dp[r - 1][c];
            if (c > 0) best = min(best, dp[r - 1][c - 1]);
            if (c < n - 1) best = min(best, dp[r - 1][c + 1]);
            dp[r][c] += best;
        }
    }
    return *min_element(dp[n - 1].begin(), dp[n - 1].end());
}
Time: O(n²) Space: O(n²)