DDSA Solutions

Gold Mine Problem

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

  1. 1dp[i][j] = max gold reachable at cell (i,j) coming from left column.
  2. 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]).
  3. 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?