leetcode:741. 摘樱桃

题目来源

题目描述

在这里插入图片描述

题目解析

题意

摘桃子,从左上角到右下角拿一次,从右下角到左上角又拿一次,怎么那,才能拿到最多

类似的题目牛客网:最大路径和

思路

一个人来回走等价成两个人从起点走到终点。

也就是两个人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);
    }
};

为什么一个遇到障碍了,另一个也不能走了

强行解释:

  • 一个是回来的路,一个是过去的路,必须全部合法,才能从[起点]到[终点]来回走。
  • 如果有一个不合法,说明不能走到终点了,或者不能走回起点了
  • 两个人只有有一个不能继续走了,说明有一个路径(去的路径或者回来的路径)无效

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值