In a N x N grid representing a field of cherries, each cell is one of three possible integers.

  • 0 means the cell is empty, so you can pass through;
  • 1 means the cell contains a cherry, that you can pick up and pass through;
  • -1 means the cell contains a thorn that blocks your way.

Your task is to collect maximum number of cherries possible by following the rules below:

  • Starting at the position (0, 0) and reaching (N-1, N-1) by moving right or down through valid path cells (cells with value 0 or 1);
  • After reaching (N-1, N-1), returning to (0, 0) by moving left or up through valid path cells;
  • When passing through a path cell containing a cherry, you pick it up and the cell becomes an empty cell (0);
  • If there is no valid path between (0, 0) and (N-1, N-1), then no cherries can be collected.

Example 1:

Input: grid =
[[0, 1, -1],
[1, 0, -1],
[1, 1, 1]]
Output: 5
Explanation:
The player started at (0, 0) and went down, down, right right to reach (2, 2).
4 cherries were picked up during this single trip, and the matrix becomes [[0,1,-1],[0,0,-1],[0,0,0]].
Then, the player went left, up, up, left to return home, picking up one more cherry.
The total number of cherries picked up is 5, and this is the maximum possible.

Note:

    • grid is an N by N 2D array, with 1 <= N <= 50.
    • Each grid[i][j] is an integer in the set {-1, 0, 1}.
    • It is guaranteed that grid[0][0] and grid[N-1][N-1] are not -1.

Approach#1: DFS + Memory. [C++]

class Solution {
public:
int cherryPickup(vector<vector<int>>& grid) {
int n = grid.size();
grid_ = &grid;
memo = vector<vector<vector<int>>>(n+1, vector<vector<int>>(n+1, vector<int>(n+1, INT_MIN)));
return max(0, dp(n-1, n-1, n-1));
} private:
vector<vector<vector<int>>> memo;
vector<vector<int>> *grid_;
int dp(int x1, int y1, int x2) {
int y2 = x1 + y1 - x2;
if (x1 < 0 || y1 < 0 || x2 < 0 || y2 < 0) return -1;
if ((*grid_)[x1][y1] < 0 || (*grid_)[x2][y2] < 0) return -1;
if (x1 == 0 && y1 == 0) return (*grid_)[x1][y1];
if (memo[x1][y1][x2] != INT_MIN) return memo[x1][y1][x2];
int tmp = max(max(dp(x1-1, y1, x2-1), dp(x1, y1-1, x2)),
max(dp(x1, y1-1, x2-1), dp(x1-1, y1, x2)));
if (tmp < 0) return memo[x1][y1][x2] = -1;
tmp += (*grid_)[x1][y1];
if (x1 != x2) tmp += (*grid_)[x2][y2];
return memo[x1][y1][x2] = tmp;
}
};

  

Analysis:

Key observation: (0, 0) to (n-1, n-1) to (0, 0) is the same as (n-1, n-1) to (0, 0) twice

Two people starting from (n-1, n-1) and go to (0, 0).

They move one step (left or up) at a time simultaneously. And pick up the cherry within the grid (if there is one).

if they ended up at the same grid with a cherry. Only one of them can pick up it.

x1, y1, x2 to represent a state y2 can be computed: y2 = x1 + y1 - x2.

dp(x1, y1, x2) computes the max cherries if start from {(x1, y1), (x2, y2)} to (0, 0), which is a recursive function.

Since two people move independently, there are 4 subproblems: (left, left), (left, up), (up, left), (left, up). Finally, we have:

dp(x1, y1, x2) = g[y1][x1] + g[y2][x2] + max(dp(x1-1, y1, x2-1), dp(x1, y1-1, x2-1), dp(x1-1, y1, x2), dp(x1, y1-1, x2))

Time complexity: O(n^3)

Space complexity: O(n^3)

Reference:

http://zxi.mytechroad.com/blog/dynamic-programming/leetcode-741-cherry-pickup/

741. Cherry Pickup的更多相关文章

  1. [LeetCode] 741. Cherry Pickup 捡樱桃

    In a N x N grid representing a field of cherries, each cell is one of three possible integers. 0 mea ...

  2. LeetCode 741. Cherry Pickup

    原题链接在这里:https://leetcode.com/problems/cherry-pickup/ 题目: In a N x N grid representing a field of che ...

  3. [LeetCode] Cherry Pickup 捡樱桃

    In a N x N grid representing a field of cherries, each cell is one of three possible integers. 0 mea ...

  4. [Swift]LeetCode741. 摘樱桃 | Cherry Pickup

    In a N x N grid representing a field of cherries, each cell is one of three possible integers. 0 mea ...

  5. LeetCode741. Cherry Pickup

    https://leetcode.com/problems/cherry-pickup/description/ In a N x N grid representing a field of che ...

  6. 动态规划-Cherry Pickup

    2020-02-03 17:46:04 问题描述: 问题求解: 非常好的题目,和two thumb其实非常类似,但是还是有个一点区别,就是本题要求最后要到达(n - 1, n - 1),只有到达了(n ...

  7. 动态规划Dynamic Programming

    动态规划Dynamic Programming code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路 理解动态规划: 递归与动态规划的联系与区别 -> 记忆化搜索 -& ...

  8. 矩形最小路径和 · Minimum Path Sum

    [抄题]: 给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径. [思维问题]: [一句话思路]: 和数字三角形基本相同 [输入量]:空: 正常情况:特大:特小:程序里 ...

  9. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

随机推荐

  1. Bootstrap模态框使用WebUploader点击失效问题解决

    解决 方法一 在上传按钮上监听一个点击事件,如create(),在该函数中重新生成上传按钮 function create(){ uploader.addButton({ id: '#filePick ...

  2. ecplice中去掉提示信息的步骤

    Window-->preferences-->Java-->Editor-->Hovers-->将Combined Hover前面的对勾去掉-->ok.

  3. 使用jsonp跨域发送请求

    如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型. 使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面. ...

  4. 前端学习之JavaScript

    JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Net ...

  5. Linux tcpdump命令

    一.简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据 ...

  6. python创建独立虚拟工作环境方法

    前言: python的组件非常之多,有时这个项目依赖m个组件,有时那个项目依赖n个组件,时间一长很容易导致系统python环境的臃肿不堪,由此便有了virtualenv.virtualenvwrapp ...

  7. Netty 系列目录

    Netty 系列目录 二 Netty 源码分析(4.1.20) 1.1 Netty 源码(一)Netty 组件简介 2.1 Netty 源码(一)服务端启动 2.2 Netty 源码(二)客户端启动 ...

  8. 解决JS中missing ( before function parameters的错误

    在编写javascript中,常出现在function处提示“missing ( before function parameters”的错误,这是怎么回事? 例如: function String. ...

  9. 2018.10.12 NOIP模拟 棋盘问题(切比雪夫距离)

    传送门 貌似是防ak题? 考试的时候想到了做四次cdqcdqcdq于是给自己多套了一个lognlognlogn结果还MLEMLEMLE 0分.(记得最后5分钟调出来的时候是那么的欣喜 下来发现并不需要 ...

  10. EXCEL 单元格引用问题

    =(SUM(INDIRECT("'2.5酒店预订收入'!"&"J"&MATCH(C21,'2.5酒店预订收入'!B:B,0)&" ...