lintcode 1811 · 寻找最多的金子 【DFS 中等 vip】

题目

https://www.lintcode.com/problem/1811

M * N网格,每个网格都有一个数字,代表该网格中的黄金数量。 如果为空,则为0。
找到一条在以下条件下获得最大金币总和的路径:
1.一条路不可以走重复的网格
2.永远不会越过零。


样例
示例:
输入:
grid = [[1,2,0,0],
       [0,0,2,2]]
输出: 4

思路

直接暴力枚举每一个出发点,然后DFS

参考代码

public class Solution {
    /**
     * @param grids: a integer two-dimensional array
     * @return: return the maximum sum of golds 
     */
    public int findMaximumGold(int[][] grids) {
        //直接暴力枚举每一个出发点,然后DFS
        int max = 0;
        for (int i = 0; i < grids.length; i++) {
            for (int j = 0; j < grids[0].length; j++) {
                if (grids[i][j] != 0) {
                    max = Math.max(max, dfs(i, j, grids));
                }
            }
        }
        return max;
    }

    public static int dfs(int x, int y, int[][] arr) {
        int n = arr.length, m = arr[0].length,
                bak = arr[x][y], res = bak,
                max = 0;
        arr[x][y] = 0;
        int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] dir : dirs) {
            int x1 = x + dir[0], y1 = y + dir[1];
            if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < m && arr[x1][y1] != 0) {
                max = Math.max(max, dfs(x1, y1, arr));
            }
        }
        arr[x][y] = bak; //dfs结束要恢复现场
        return res + max;
    }
}

你可能感兴趣的:(深度优先,算法)