Gold Mine Problem
JavaView on GFG
Time: O(n*m)
Space: O(n*m)
Advertisement
Intuition
DP: you can enter from any row in column 0 and move right, right-up, or right-down. Find path maximizing gold collected.
Algorithm
- 1dp[i][j] = max gold reachable at cell (i,j) coming from left column.
- 2For each column j from 1: for each row i: dp[i][j] = grid[i][j] + max(dp[i-1][j-1], dp[i][j-1], dp[i+1][j-1]).
- 3Return max over all dp[i][n-1].
Common Pitfalls
- •Boundary checks for first/last rows. Can start from any cell in column 0. Must move left to right only.
Gold Mine Problem.java
Java
// Approach: DP. Process column by column. For each cell, best gold = cell + max of (upper-left, left, lower-left).
// Time: O(n*m) Space: O(n*m)
import java.util.*;
class Solution {
public int maxGold(int[][] mat) {
int n = mat.length;
int m = mat[0].length;
int[][] dp = new int[n + 1][m + 1];
for (int[] d : dp)
Arrays.fill(d, -1);
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if ((i == 0 && j == 0) || j < i)
ans = Math.max(ans, func(i, j, mat, dp));
}
}
return ans;
}
int func(int i, int j, int[][] mat, int[][] dp) {
if (i < 0 || j >= mat[0].length || i >= mat.length)
return 0;
if (dp[i][j] != -1)
return dp[i][j];
return dp[i][j] = mat[i][j]
+ Math.max(func(i - 1, j + 1, mat, dp), Math.max(func(i, j + 1, mat, dp), func(i + 1, j + 1, mat, dp)));
}
}Advertisement
Was this solution helpful?