C++中具有最大黄金值的路径
假设在一个m * n大小的金矿网格中,每个单元格中的整数代表该单元格中的黄金数量,0表示该单元格为空。我们必须在以下条件下找到可以收集到的最大黄金数量:
- 每次指向一个单元格时,我们将收集该单元格中的所有黄金。
- 从我们的位置,我们可以向左、右、上或下走一步。
- 我们不能多次访问同一个单元格。
- 永不访问黄金为0的单元格。
因此,如果输入类似于[[0,6,0],[5,8,7],[0,9,0]],则结果将为24。获得最大黄金的路径是9 -> 8 -> 7
为了解决这个问题,我们将遵循以下步骤:
- 创建一个名为dfs的方法,它接受grid、n、m、i和j。它的作用如下:
- 如果i >= n 或j >= m 或i<0 或j < 0 或grid[i, j] = -1 或grid[i, j] = 0,则返回0
- temp := grid[i, j],cost := grid[i, j] 并且 grid[i, j] = -1
- cost := cost + dfs(grid, n, m, i + 1, j)、dfs(grid, n, m, i – 1, j) 和dfs(grid, n, m, i, j – 1)中的最大值
- grid[i, j] := temp
- 返回cost
- 主方法将是:
- n := grid的行数,m := grid的列数,ans := 0
- 对于范围从0到n – 1的i
- 对于范围从0到m – 1的j
- 如果grid[i, j]不为0,则ans := ans、dfs(grid, n, m, i, j)中的最大值
- 对于范围从0到m – 1的j
- 返回ans
让我们看看下面的实现,以便更好地理解:
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int dfs(vector<vector<int>>& grid, int n, int m, int i, int j){
if(i>=n || j>=m ||i<0||j<0 || grid[i][j]==-1 || grid[i][j] == 0)return 0;
int temp =grid[i][j];
int cost = grid[i][j];
grid[i][j] = -1;
cost+=max({dfs(grid,n,m,i+1,j),dfs(grid,n,m,i-1,j),dfs(grid,n,m,i,j+1),dfs(grid,n,m,i,j-1)});
grid[i][j] = temp;
return cost;
}
int getMaximumGold(vector<vector<int>>& grid) {
int n = grid.size() ;
int m = grid[0].size();
int ans = 0;
for(int i =0;i<n;i++){
for(int j =0;j<m;j++){
if(grid[i][j]){
//cout << "Start : " << i <<" " << j << endl;
ans = max(ans,dfs(grid,n,m,i,j));
}
}
}
return ans;
}
};
main(){
vector<vector<int>> v = {{0,6,0},{5,8,7},{0,9,0}};
Solution ob;
cout << (ob.getMaximumGold(v));
}输入
[[0,6,0],[5,8,7],[0,9,0]]
输出
24
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP