• leetcode 1219. Path with Maximum Gold


    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.

    Return the maximum amount of gold you can collect under the conditions:

    • Every time you are located in a cell you will collect all the gold in that cell.
    • From your position you can walk one step to the left, right, up or down.
    • You can't visit the same cell more than once.
    • Never visit a cell with 0 gold.
    • You can start and stop collecting gold from any position in the grid that has some gold.

    Example 1:

    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:

    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:

    • 1 <= grid.length, grid[i].length <= 15
    • 0 <= grid[i][j] <= 100
    • There are at most 25 cells containing gold.

    思路:常规题(回溯法)

     1 class Solution {
     2 private:
     3     //int dx[4] = {-1, 0, 1, 0};
     4     int d[5] = {0, 1, 0, -1, 0};
     5 public:
     6     int getMaximumGold(vector<vector<int>>& grid) {
     7         int m = grid.size();
     8         if (m == 0)
     9             return 0;
    10         int n = grid[0].size();
    11         int maxGold = 0;
    12         for (int i = 0; i < m; ++i) {
    13             for (int j = 0; j < n; ++j) {
    14                 if (grid[i][j] > 0) {
    15                     maxGold = max(maxGold, dfs(grid, i, j));
    16                 }
    17             }
    18         }
    19         return maxGold;
    20     }
    21     int dfs(vector<vector<int>> &grid, int i, int j) {
    22         int result = 0;
    23         int temp = grid[i][j];
    24         grid[i][j] = 0; //将grid[i][j]设为0,使得深层的dfs(同一条路径)不会再遍历这个点
    25         for (int k = 0; k < 4; ++k) { //遍历四个方向
    26             int x = i + d[k], y = j + d[k + 1];
    27             if (x >= 0 && x < grid.size() && y >= 0 && y <  grid[0].size() && grid[x][y] != 0) {
    28                 result = max(result, dfs(grid, x, y));
    29             }
    30         }
    31         grid[i][j] = temp; //将grid[i][j]恢复,使得不同路径还能访问这个点
    32         return result + grid[i][j];
    33     }
    34 };
  • 相关阅读:
    HDU 1102 Constructing Roads
    HDU 1285 确定比赛名次。
    最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
    HDU Jungle Roads 1301 最小生成树、
    并查集小结(转)
    HDU hdu 2094 产生冠军 拓扑排序 判定环
    模运算(转)
    拓扑排序(主要是确定环和加法) HDU 2647 Reward
    HDU 1372 Knight Moves 简单BFS
    用计算机模型浅析人与人之间沟通方式 (一)如何谈话
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/11896311.html
Copyright © 2020-2023  润新知