两人从矩阵的左上角穿越到右下角,即可获得最高分。
- 最后更新 : 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 gridif (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 visitedcache[x1][y1][x2][y2] = 1;// Collect money from the grid cellint money = grid[y1][x1] -'0';if (x1 != x2 || y1 != y2)money += grid[y2][x2] -'0';// Take maximum of all possibilitiesreturn 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 Codeint32_t main(){// Given Inputn = 3;m = 3;grid.push_back("111");grid.push_back("101");grid.push_back("111");// Function Callcout << maxMoney(0, 0, 0, 0);return 0;} |
输出
8
**时间复杂度。**O(2N*2M)
辅助空间。O ((N*M)2)
读者请注意!现在不要停止学习。以学生可接受的价格掌握所有重要的DSA概念。 DSA自学课程以适合学生的价格掌握所有重要的DSA概念,并为行业做好准备。 要完成从学习语言到DS Algo以及更多的准备工作,请参考 完整的面试准备课程.
如果你想参加专家的现场课程 ,请参考 面向在职人士的DSA现场课程 和 面向学生的竞争性编程直播课程.
我的个人笔记 arrow_drop_up
保存