题目来源
题目描述
题目解析
题意
摘桃子,从左上角到右下角拿一次,从右下角到左上角又拿一次,怎么那,才能拿到最多
类似的题目牛客网:最大路径和
思路
一个人来回走等价成两个人从起点走到终点。
也就是两个人A、B都从左下角走到右下角,都只能向下或者向右走,但是A和B能做出不同的选择。
- 如果,某一时刻,AB进入相同的格子,A和B就只能获得一份。
- 如果某一个位置,A也来过,B也来过,AB一定是同时来的,而不会分先后,因为AB同时走
走完之后,就认为B是回来的路径
class Solution {
int process(vector<vector<int>>& grid, int x1, int y1, int x2, int y2){
int N = grid.size(), M = grid[0].size();
if(x1 == N || y1 == M || x2 == N || y2 == M){
return INT16_MIN;
}
if(x1 == N - 1 && y1 == M - 1){
return grid[x1][y1];
}
int next = INT16_MIN;
next = std::max(next, process(grid, x1 + 1, y1, x2 + 1, y2));
next = std::max(next, process(grid, x1 + 1, y1, x2, y2 + 1));
next = std::max(next, process(grid, x1, y1 + 1, x2 + 1, y2));
next = std::max(next, process(grid, x1, y1 + 1, x2, y2 + 1));
if(grid[x1][y1] == -1 || grid[x2][y2] == -1 || next == -1){
return -1;
}
if(x1 == x2){
return grid[x1][y1] + next;
}
return grid[x1][y1] + grid[x2][y2] + next;
}
public:
int shortestBridge(vector<vector<int>>& grid) {
return process(grid, 0, 0, 0, 0);
}
};
为什么一个遇到障碍了,另一个也不能走了
强行解释:
- 一个是回来的路,一个是过去的路,必须全部合法,才能从[起点]到[终点]来回走。
- 如果有一个不合法,说明不能走到终点了,或者不能走回起点了
- 两个人只有有一个不能继续走了,说明有一个路径(去的路径或者回来的路径)无效