Path with Maximum Gold

medium backtracking dfs grid

Problem

In a gold mine grid, walk from any starting cell, picking up its gold and moving up/down/left/right without revisiting cells or stepping on 0-cells. Return the maximum gold you can collect.

Inputgrid = [[0,6,0],[5,8,7],[0,9,0]]
Output24
Start at 9, then 8, then 7 → 9 + 8 + 7 = 24.

def get_maximum_gold(grid):
    R, C = len(grid), len(grid[0])
    def dfs(r, c):
        if r < 0 or r >= R or c < 0 or c >= C or grid[r][c] == 0:
            return 0
        g = grid[r][c]
        grid[r][c] = 0
        best = max(dfs(r+1,c), dfs(r-1,c), dfs(r,c+1), dfs(r,c-1))
        grid[r][c] = g
        return g + best
    return max((dfs(r, c) for r in range(R) for c in range(C)), default=0)
function getMaximumGold(grid) {
  const R = grid.length, C = grid[0].length;
  function dfs(r, c) {
    if (r < 0 || r >= R || c < 0 || c >= C || grid[r][c] === 0) return 0;
    const g = grid[r][c];
    grid[r][c] = 0;
    const best = Math.max(dfs(r + 1, c), dfs(r - 1, c), dfs(r, c + 1), dfs(r, c - 1));
    grid[r][c] = g;
    return g + best;
  }
  let ans = 0;
  for (let r = 0; r < R; r++) for (let c = 0; c < C; c++) ans = Math.max(ans, dfs(r, c));
  return ans;
}
class Solution {
    int R, C; int[][] g;
    public int getMaximumGold(int[][] grid) {
        g = grid; R = grid.length; C = grid[0].length;
        int ans = 0;
        for (int r = 0; r < R; r++) for (int c = 0; c < C; c++) ans = Math.max(ans, dfs(r, c));
        return ans;
    }
    int dfs(int r, int c) {
        if (r < 0 || r >= R || c < 0 || c >= C || g[r][c] == 0) return 0;
        int v = g[r][c]; g[r][c] = 0;
        int best = Math.max(Math.max(dfs(r+1,c), dfs(r-1,c)), Math.max(dfs(r,c+1), dfs(r,c-1)));
        g[r][c] = v;
        return v + best;
    }
}
class Solution {
    int R, C;
    vector<vector<int>>* gp;
    int dfs(int r, int c) {
        auto& g = *gp;
        if (r < 0 || r >= R || c < 0 || c >= C || g[r][c] == 0) return 0;
        int v = g[r][c]; g[r][c] = 0;
        int best = max({dfs(r+1,c), dfs(r-1,c), dfs(r,c+1), dfs(r,c-1)});
        g[r][c] = v;
        return v + best;
    }
public:
    int getMaximumGold(vector<vector<int>>& grid) {
        gp = &grid; R = grid.size(); C = grid[0].size();
        int ans = 0;
        for (int r = 0; r < R; r++) for (int c = 0; c < C; c++) ans = max(ans, dfs(r, c));
        return ans;
    }
};
Time: O(R · C · 4^k) (k = gold cells) Space: O(k) recursion