教程贴:从矩阵左上角到右下角的最大值

153 阅读2分钟

两人从矩阵的左上角穿越到右下角,即可获得最高分。

  • 最后更新 : 2021年8月9日

给出一个N*M 阶的矩阵 grid[][],单元格内有数字0-9 。任务是找出两个人从**(0,0)(N-1,M-1)** 只向右向下移动时收集到的最大金额。如果两个人都在同一个单元格,那么他们中只有一个人可以在该位置捡到钱。

例子。

输入:
1 1 1
1 0 1
1 1
输出。 8
解释**。** 让1表示1号人取钱的地方,2表示2号人取钱的地方,那么一个可能的解决方案是:
1 1 1
2 0 1
2 2 1

输入:
0 9 9 3 3
2 9 3 3 3
0 3 3 3 3
4 1 1 1 1
输出。 52

办法。这 个问题可以用递归的方法来解决,在每个单元格中向下和向右移动两个人,找到从**(0,0)(N-1,M-1)**所有路径的最大路径总和。因此,我们的想法是找到所有可能的路径的成本,并找到其中的最大值。

下面是上述方法的实现。

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
const static int MAXR = 20, MAXC = 20;
int cache[MAXC][MAXR][MAXC][MAXR],
dp[MAXC][MAXR][MAXC][MAXR];
int n, m;
vector<string> grid;
// Function to find maximum money collected
// when moving from (0, 0) to (N-1, M-1)
int maxMoney(int x1,int y1,int x2,int y2)
{
// Out of bounds of grid
if (x1 >= n || y1 >= m || x2 >= n || y2 >= m)
return 0;
if (cache[x1][y1][x2][y2] != 0)
return dp[x1][y1][x2][y2];
// Mark state as visited
cache[x1][y1][x2][y2] = 1;
// Collect money from the grid cell
int money = grid[y1][x1] -'0';
if (x1 != x2 || y1 != y2)
money += grid[y2][x2] -'0';
// Take maximum of all possibilities
return dp[x1][y1][x2][y2]
= money
+ max(
max(maxMoney(x1 + 1, y1, x2 + 1, y2),
maxMoney(x1, y1 + 1, x2 + 1, y2)),
max(maxMoney(x1 + 1, y1, x2, y2 + 1),
maxMoney(x1, y1 + 1, x2, y2 + 1)));
}
// Driver Code
int32_t main()
{
// Given Input
n = 3;
m = 3;
grid.push_back("111");
grid.push_back("101");
grid.push_back("111");
// Function Call
cout << maxMoney(0, 0, 0, 0);
return 0;
}

输出

8

**时间复杂度。**O(2N*2M)
辅助空间。O ((N*M)2)

读者请注意!现在不要停止学习。以学生可接受的价格掌握所有重要的DSA概念。 DSA自学课程以适合学生的价格掌握所有重要的DSA概念,并为行业做好准备。 要完成从学习语言到DS Algo以及更多的准备工作,请参考 完整的面试准备课程.

如果你想参加专家的现场课程 ,请参考 面向在职人士的DSA现场课程面向学生的竞争性编程直播课程.

我的个人笔记 arrow_drop_up

保存