原题链接在这里:https://leetcode.com/problems/cherry-pickup/

题目:

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.

题解:

It could be understanding as two people collecting cheeries from (n-1, n-1) to (0, 0).

Two people cooridinates are (x1, y1), (x2, y2).

dfs(x1, y1, x2, y2) returns maximum cheeries collected from two cooridinates to (0, 0).

Thus max(x1, y1, x2, y2) = grid[x1][y1] + grid[x2][y2] + max(dfs(x1-1, y1, x2-1, y2), dfs(x1, y1-1, x2, y2-1), dfs(x1-1, y1, x2, y2-1), dfs(x1, y1-1, x2-1, y2)).

First person could move from top, or left. Second person could do the same. Totally 4 combinations.

And of cource, if x1==y1, which means both people are on the same grid, its cheery can't be collected twice.

y2 = x1+y1-x2. since both of them have same total steps.

Time Complexity: O(n^3).

Space: O(n^3).

AC Java:

 class Solution {
int [][][] dp;
int n;
public int cherryPickup(int[][] grid) {
if(grid == null || grid.length == 0 || grid[0].length == 0){
return 0;
} n = grid.length;
dp = new int[n][n][n];
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
Arrays.fill(dp[i][j], Integer.MIN_VALUE);
}
} return Math.max(0, dfs(grid, n-1, n-1, n-1));
} private int dfs(int [][] grid, 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(dp[x1][y1][x2] != Integer.MIN_VALUE){
return dp[x1][y1][x2];
} if(x1==0 && y1==0){
dp[0][0][0] = grid[0][0];
return grid[0][0];
} int res = Math.max(Math.max(dfs(grid, x1-1, y1, x2-1), dfs(grid, x1, y1-1, x2)), Math.max(dfs(grid, x1-1, y1, x2), dfs(grid, x1, y1-1, x2-1)));
if(res < 0){
dp[x1][y1][x2] = -1;
return -1;
} res += grid[x1][y1];
if(x1 != x2){
res += grid[x2][y2];
} dp[x1][y1][x2] = res;
return res;
}
}

LeetCode 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. 741. Cherry Pickup

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

  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. Java实现 LeetCode 741 摘樱桃(DFS || 递推 || 传纸条)

    741. 摘樱桃 一个N x N的网格(grid) 代表了一块樱桃地,每个格子由以下三种数字的一种来表示: 0 表示这个格子是空的,所以你可以穿过它. 1 表示这个格子里装着一个樱桃,你可以摘到樱桃然 ...

  7. 动态规划-Cherry Pickup

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

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

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

  9. leetcode 学习心得 (4)

    645. Set Mismatch The set S originally contains numbers from 1 to n. But unfortunately, due to the d ...

随机推荐

  1. 是真的随笔qvq

    DATE:2019.11.20 今天考了试——对光荣爆零.从14:00考到18:30,隔壁计算机教室的电脑弄得心态炸裂了,各种卡,肝了一个下午的两道题以电脑死机没有代码结尾,考完才知道这是最好骗分的两 ...

  2. Linux下signal信号汇总

    SIGHUP /* Hangup (POSIX). */ 终止进程 终端线路挂断 SIGINT /* Interrupt (ANSI). */ 终止进程 中断进程 Ctrl+C SIGQUIT /* ...

  3. VB.NET 读写XML

    Public Class CSysXML Dim mXmlDoc As New System.Xml.XmlDocument Public XmlFile As String Public Sub N ...

  4. javascript应该嵌入到html中的什么位置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. RSA非对称 私钥加密

    RSA生成公钥和私钥对 /// <summary> /// RSA生成公钥和私钥 /// </summary> /// <returns></returns& ...

  6. 学习笔记—log4net

    一.log4net.dll下载地址:http://logging.apache.org/log4net/download_log4net.cgi 二.在项目中引用log4net.dll 三.设置在程序 ...

  7. form表单的密码是否一致校验功能

    这是form类表单,自定义的form表单,需要重写钩子函数 """ forms类表单 """ # 校验密码是否一致 from django. ...

  8. python class 中__next__用法

    class A(): def __init__(self,b): self.b=b # def __iter__(self): # 这个函数可以用,表示迭代标志,但也可以省略 # return sel ...

  9. SpringDataRedis

    一.简介 1.SpringData和Redis Redis将数据存储到内存的,速度快.可以解决请求mysql数据库过多而导致mysql崩溃的问题. SpringData是专门用来控制Redis的工具, ...

  10. 拓展 - Webrtc 的回声抵消(aec、aecm)算法简介

    webrtc 的回声抵消(aec.aecm)算法简介 原文链接:丢失.不好意思        webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS( ...