5
int[] dx = new int[] {0, 0, 1, -1};6
int[] dy = new int[] {1, -1, 0, 0};10
private boolean isValid(int i, int j) {11
return Math.min(i, j) >= 0 && i < n && j < m && !seen[i][j];14
private int solve(int i, int j, int cnt) {15
if (cnt >= finalres) return finalres;16
if (i == n - 1 && j == m - 1) {19
if (dp[i][j] != Integer.MAX_VALUE) return dp[i][j];22
for (int k = 0; k < 4; k++) {23
int newI = i + dx[k], newJ = j + dy[k];24
if (isValid(newI, newJ)) {25
res = Math.min(res, solve(newI, newJ, cnt + grid[i][j]));29
return dp[i][j] = Math.min(dp[i][j], res);32
public int minimumObstacles(int[][] grid) {35
this.m = grid[0].length;36
this.seen = new boolean[n][m];39
for (int[] row : dp) Arrays.fill(row, Integer.MAX_VALUE);40
return solve(0, 0, 0);