你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,并用大小為 m * n 的網格 grid 進行了標注。每個單元格中的整數就表示這一單元格中的黃金數量;如果該單元格是空的,那么就是 0。
為了使收益最大化,礦工需要按以下規則來開采黃金:
每當礦工進入一個單元,就會收集該單元格中的所有黃金。
礦工每次可以從當前位置向上下左右四個方向走。
每個單元格只能被開采(進入)一次。
不得開采(進入)黃金數目為 0 的單元格。
礦工可以從網格中 任意一個 有黃金的單元格出發或者是停止。
示例 1:
輸入:grid = [[0,6,0],[5,8,7],[0,9,0]]
輸出:24
解釋:
[[0,6,0],
[5,8,7],
[0,9,0]]
一種收集最多黃金的路線是:9 -> 8 -> 7。
代碼
class Solution {int[][] dir=new int[][]{{-1,0},{1,0},{0,-1},{0,1}};int ans =0;boolean[][] check;public int getMaximumGold(int[][] grid) {int n=grid.length,m=grid[0].length;check=new boolean[n][m];for(int i=0;i<n;i++)//從不同起點出發for(int j=0;j<m;j++){if(grid[i][j]!=0)getMax(grid,0,i,j);}return ans;}public void getMax(int[][] grid,int sum,int x,int y) {check[x][y]=true;//標記for(int[] d:dir)//可到達的位置{int nextX=x+d[0],nextY=y+d[1];if(nextX<0||nextY<0||nextX>=grid.length||nextY>=grid[0].length||check[nextX][nextY]||grid[nextX][nextY]==0)//無路可走{ans= Math.max(ans,sum+grid[x][y]);continue;}getMax(grid,sum+grid[x][y],nextX,nextY);}check[x][y]=false;}
}