原題連接在這裏:https://leetcode.com/problems/path-with-maximum-gold/this
題目:spa
In a gold mine grid
of size m * n
, each cell in this mine has an integer representing the amount of gold in that cell, 0
if it is empty.code
Return the maximum amount of gold you can collect under the conditions:blog
0
gold.Example 1:leetcode
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:get
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:it
1 <= grid.length, grid[i].length <= 15
0 <= grid[i][j] <= 100
題解:io
For each cell in the grid, start DFS.class
DFS state is current index and current sum. And it should return starting at current index, the maximum glod it could get.grid
If current index is illegal, return current sum.
Otherwise, accumlate grid[i][j] to sum. And for each direction, do DFS. Get the maximum among 4 directions, and return.
Before return, backtracking grid[i][j] to its original value.
Time Complexity: expontential.
Space: O(m*n). m = grid.length. n = grid[0].length.
AC Java:
1 class Solution { 2 int [][] grid; 3 int m; 4 int n; 5 int [][] dirs = new int[][]{{0, 1}, {0, -1}, {-1, 0}, {1, 0}}; 6 7 public int getMaximumGold(int[][] grid) { 8 if(grid == null || grid.length == 0 || grid[0].length == 0){ 9 return 0; 10 } 11 12 int res = 0; 13 this.grid = grid; 14 this.m = grid.length; 15 this.n = grid[0].length; 16 for(int i = 0; i<m; i++){ 17 for(int j = 0; j<n; j++){ 18 int sum = dfs(i, j, 0); 19 res = Math.max(res, sum); 20 } 21 } 22 23 return res; 24 } 25 26 private int dfs(int i, int j, int sum){ 27 if(i<0 || i>=m || j<0 || j>=n || grid[i][j]==0){ 28 return sum; 29 } 30 31 32 sum += grid[i][j]; 33 int temp = grid[i][j]; 34 grid[i][j] = 0; 35 36 int max = 0; 37 for(int [] dir : dirs){ 38 int x = i + dir[0]; 39 int y = j + dir[1]; 40 41 max = Math.max(max, dfs(x, y, sum)); 42 } 43 44 grid[i][j] = temp; 45 return max; 46 } 47 }