leetcode 1219.黄金矿工

原题如下:

https://leetcode-cn.com/problems/path-with-maximum-gold/
leetcode 1219.黄金矿工_第1张图片

题解

思路

第一次使用动态规划,以后还会继续好好学习的。
这个思路的思想就是首先找到矿工开始寻宝的起点,为了全面,我们需要遍历每一个格子,也就是说,我们需要以没一个格子为起点,找到以此格子为起点可以获得的最大金子数量,再在这些最大值里面取出最大值就为答案。
代码中的主方法的主要作用就是遍历格子,并且试着以没一个格子为起点。下面的方法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/

你可能感兴趣的:(可爱宝宝做leetcode)