Welcome to Subscribe On Youtube

1289. Minimum Falling Path Sum II

Description

Given an n x n integer matrix grid, return the minimum sum of a falling path with non-zero shifts.

A falling path with non-zero shifts is a choice of exactly one element from each row of grid such that no two elements chosen in adjacent rows are in the same column.

 

Example 1:

Input: grid = [[1,2,3],[4,5,6],[7,8,9]]
Output: 13
Explanation: 
The possible falling paths are:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]
The falling path with the smallest sum is [1,5,7], so the answer is 13.

Example 2:

Input: grid = [[7]]
Output: 7

 

Constraints:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • -99 <= grid[i][j] <= 99

Solutions

  • class Solution {
        public int minFallingPathSum(int[][] grid) {
            int n = grid.length;
            int[][] f = new int[n + 1][n];
            final int inf = 1 << 30;
            for (int i = 1; i <= n; ++i) {
                for (int j = 0; j < n; ++j) {
                    int x = inf;
                    for (int k = 0; k < n; ++k) {
                        if (k != j) {
                            x = Math.min(x, f[i - 1][k]);
                        }
                    }
                    f[i][j] = grid[i - 1][j] + (x == inf ? 0 : x);
                }
            }
            int ans = inf;
            for (int x : f[n]) {
                ans = Math.min(ans, x);
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        int minFallingPathSum(vector<vector<int>>& grid) {
            int n = grid.size();
            int f[n + 1][n];
            memset(f, 0, sizeof(f));
            const int inf = 1 << 30;
            for (int i = 1; i <= n; ++i) {
                for (int j = 0; j < n; ++j) {
                    int x = inf;
                    for (int k = 0; k < n; ++k) {
                        if (k != j) {
                            x = min(x, f[i - 1][k]);
                        }
                    }
                    f[i][j] = grid[i - 1][j] + (x == inf ? 0 : x);
                }
            }
            return *min_element(f[n], f[n] + n);
        }
    };
    
  • class Solution:
        def minFallingPathSum(self, grid: List[List[int]]) -> int:
            n = len(grid)
            f = [[0] * n for _ in range(n + 1)]
            for i, row in enumerate(grid, 1):
                for j, v in enumerate(row):
                    x = min((f[i - 1][k] for k in range(n) if k != j), default=0)
                    f[i][j] = v + x
            return min(f[n])
    
    
  • func minFallingPathSum(grid [][]int) int {
    	n := len(grid)
    	f := make([][]int, n+1)
    	for i := range f {
    		f[i] = make([]int, n)
    	}
    	const inf = 1 << 30
    	for i, row := range grid {
    		i++
    		for j, v := range row {
    			x := inf
    			for k := range row {
    				if k != j {
    					x = min(x, f[i-1][k])
    				}
    			}
    			if x == inf {
    				x = 0
    			}
    			f[i][j] = v + x
    		}
    	}
    	return slices.Min(f[n])
    }
    

All Problems

All Solutions