1219. Path with Maximum Gold
Description
In a gold mine grid
of size m x n
, each cell in this mine has an integer representing the amount of gold in that cell, 0
if it is empty.
Return the maximum amount of gold you can collect under the conditions:
- Every time you are located in a cell you will collect all the gold in that cell.
- From your position, you can walk one step to the left, right, up, or down.
- You can't visit the same cell more than once.
- Never visit a cell with
0
gold. - You can start and stop collecting gold from any position in the grid that has some gold.
Example 1:
Input: grid = [[0,6,0],[5,8,7],[0,9,0]] Output: 24 Explanation: [[0,6,0], [5,8,7], [0,9,0]] Path to get the maximum gold, 9 -> 8 -> 7.
Example 2:
Input: grid = [[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]] Output: 28 Explanation: [[1,0,7], [2,0,6], [3,4,5], [0,3,0], [9,0,20]] Path to get the maximum gold, 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7.
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 15
0 <= grid[i][j] <= 100
- There are at most 25 cells containing gold.
Solutions
Solution: Depth-First Search
- Time complexity: O(4mn)
- Space complexity: O(mn)
JavaScript
js
/**
* @param {number[][]} grid
* @return {number}
*/
const getMaximumGold = function (grid) {
const m = grid.length;
const n = grid[0].length;
const collectGold = (row, col) => {
if (row < 0 || col < 0 || row >= m || col >= n) return 0;
const gold = grid[row][col];
if (!gold) return 0;
grid[row][col] = 0;
const left = collectGold(row, col - 1);
const right = collectGold(row, col + 1);
const up = collectGold(row - 1, col);
const down = collectGold(row + 1, col);
grid[row][col] = gold;
return gold + Math.max(left, right, up, down);
};
let result = 0;
for (let row = 0; row < m; row++) {
for (let col = 0; col < n; col++) {
const gold = grid[row][col];
if (!gold) continue;
const total = collectGold(row, col);
result = Math.max(total, result);
}
}
return result;
};