原题如下:
https://leetcode-cn.com/problems/path-with-maximum-gold/
题解
思路
第一次使用动态规划,以后还会继续好好学习的。
这个思路的思想就是首先找到矿工开始寻宝的起点,为了全面,我们需要遍历每一个格子,也就是说,我们需要以没一个格子为起点,找到以此格子为起点可以获得的最大金子数量,再在这些最大值里面取出最大值就为答案。
代码中的主方法的主要作用就是遍历格子,并且试着以没一个格子为起点。下面的方法void kaishizou() 视为找寻以某一个格子为起点(可能不是路线最终的起点),已经有有某一个金子的积累量,直到找到尽头的时的手里所能获得金子的最大值。方法中我们需要多次内部调用自己,因为每走一步,都最多可能有四个方向走下一步,每个细小分支都需要走到无路可走为止
本思路java代码
/*参考lc用户 @LSZ 的的解答
*作者@v7fgg
*执行用时 :24 ms, 在所有 Java 提交中击败了53.62%的用户
*内存消耗 :37.2 MB, 在所有 Java 提交中击败了16.67%的用户
*2020年6月8日 14:35
*/
class Solution {
int ans=0;
public int getMaximumGold(int[][] grid) {
int hangshu=grid.length;
if(hangshu>0){//要保证金矿是有长宽的,否则没有意义
int lieshu=grid[0].length;
boolean laiguo[][]=new boolean[hangshu][lieshu];//临时记录这个格子来没来过
//下面这个嵌套循环遍历每一个格子,以此位起点,找到最大所得
for(int i=0;i<hangshu;i++){
for(int j=0;j<lieshu;j++){
if(grid[i][j]>0){
kaishizou(grid,i,j,0,laiguo);
}
}//return ans;位置错误
}return ans;//语句的位置很重要位置
}return 0;
}
public void kaishizou(int grid[][],int x,int y,int jinzi,boolean[][] laiguo){
//此方法的作用是找到以grid[x][y]为开始,并且手里已经有了jinzi的金子时的可能的最大所得
if(!(x>=0&&x<grid.length&&y>=0&&y<grid[0].length)||laiguo[x][y]||grid[x][y]==0){
ans=Math.max(ans,jinzi);
return;
}
jinzi+=grid[x][y];
laiguo[x][y]=true;//来过xy了
//下面以xy的四个方向为起点继续找最小值
kaishizou(grid,x+1,y,jinzi,laiguo);
kaishizou(grid,x-1,y,jinzi,laiguo);
kaishizou(grid,x,y+1,jinzi,laiguo);
kaishizou(grid,x,y-1,jinzi,laiguo);
laiguo[x][y]=false;//这句是为了上述四句互不干扰
}
}
//参考资料:https://leetcode-cn.com/problems/path-with-maximum-gold/solution/java-dfs-by-lsz/