class Solution {
public int minFallingPathSum(int[][] grid) {
int n = grid.length;
int[][] dp = new int[n][n];
for (int[] row : dp)
Arrays.fill(row, -1);
int minSum = Integer.MAX_VALUE;
for (int col = 0; col < n; col++) {
minSum = Math.min(minSum, helper(grid, 0, col, dp));
}
return minSum;
}
private int helper(int[][] grid, int row, int col, int[][] dp) {
int n = grid.length;
if (row == n - 1) return grid[row][col];
if (dp[row][col] != -1) return dp[row][col];
int min = Integer.MAX_VALUE;
for (int nextCol = 0; nextCol < n; nextCol++) {
if (nextCol != col) {
min = Math.min(min, helper(grid, row + 1, nextCol, dp));
}
}
return dp[row][col] = grid[row][col] + min;
}
}