741. 摘樱桃

一个N x N的网格(grid) 代表了一块樱桃地,每个格子由以下三种数字的一种来表示:

0 表示这个格子是空的,所以你可以穿过它。
1 表示这个格子里装着一个樱桃,你可以摘到樱桃然后穿过它。
-1 表示这个格子里有荆棘,挡着你的路。
你的任务是在遵守下列规则的情况下,尽可能的摘到最多樱桃:

从位置 (0, 0) 出发,最后到达 (N-1, N-1) ,只能向下或向右走,并且只能穿越有效的格子(即只可以穿过值为0或者1的格子);
当到达 (N-1, N-1) 后,你要继续走,直到返回到 (0, 0) ,只能向上或向左走,并且只能穿越有效的格子;
当你经过一个格子且这个格子包含一个樱桃时,你将摘到樱桃并且这个格子会变成空的(值变为0);
如果在 (0, 0) 和 (N-1, N-1) 之间不存在一条可经过的路径,则没有任何一个樱桃能被摘到。
示例 1:

输入: grid =
[[0, 1, -1],
[1, 0, -1],
[1, 1, 1]]
输出: 5
解释:
玩家从(0,0)点出发,经过了向下走,向下走,向右走,向右走,到达了点(2, 2)。
在这趟单程中,总共摘到了4颗樱桃,矩阵变成了[[0,1,-1],[0,0,-1],[0,0,0]]。
接着,这名玩家向左走,向上走,向上走,向左走,返回了起始点,又摘到了1颗樱桃。
在旅程中,总共摘到了5颗樱桃,这是可以摘到的最大值了。
说明:

grid 是一个 N * N 的二维数组,N的取值范围是1 <= N <= 50。
每一个 grid[i][j] 都是集合 {-1, 0, 1}其中的一个数。
可以保证起点 grid[0][0] 和终点 grid[N-1][N-1] 的值都不会是 -1。

PS:
这道题可以转换一下变成: 我一下走两个位置并且只能往下走或者往右走
既然这么走,我的这一个位置的x+y就会等于另一个位置的x+y
或者用数组做,保存坐标

class Solution {public int cherryPickup(int[][] grid) { int m = grid.length;int memo[][][] = new int[m][m][m];for (int[][] layer: memo)for (int[] row: layer)Arrays.fill(row, Integer.MIN_VALUE);int res = dp(grid,memo,0,0,0);return Math.max(res,0);}public int dp(int[][] grid,int[][][] memo,int r1,int c1, int r2){int c2  =r1+c1-r2;if(r1==grid.length||r2==grid.length||c1==grid.length||c2==grid.length||grid[r1][c1]==-1||grid[r2][c2]==-1){return -99999;}if(r1==grid.length-1&&c1==grid.length-1){return grid[r1][c1];}if(memo[r1][c1][r2]!=Integer.MIN_VALUE){return memo[r1][c1][r2];}int ans = 0;if(r1!=r2){ans = max(dp(grid,memo,r1+1,c1,r2+1),dp(grid,memo,r1+1,c1,r2),dp(grid,memo,r1,c1+1,r2+1),dp(grid,memo,r1,c1+1,r2) ) + grid[r1][c1] + grid[r2][c2];}else{ans = max(dp(grid,memo,r1+1,c1,r2+1),dp(grid,memo,r1+1,c1,r2),dp(grid,memo,r1,c1+1,r2+1),dp(grid,memo,r1,c1+1,r2)) + grid[r1][c1];}memo[r1][c1][r2] = ans;return ans;}public int max(int a, int b,int c,int d){a = Math.max(a,b);a = Math.max(a,c);a = Math.max(a,d);return a;}
}
class Solution {public int cherryPickup(int[][] grid) {int N = grid.length;int[][] dp = new int[N + 1][N + 1];for (int[] row : dp) {Arrays.fill(row, Integer.MIN_VALUE);//使用了N+1,因此边界值也设置为MIN_VALUE}dp[N - 1][N - 1] = grid[N - 1][N - 1];//sum表示一共要走的步数,也就是所谓的递增就好,不需要使用三维数组k,当前走第k步,一共要走2*N-2步(n-1)*2,下标的话就是2N-3for (int sum = 2 * N - 3; sum >= 0; sum--) {for (int i1 = Math.max(0, sum - N + 1); i1 <= Math.min(N - 1, sum); i1++) {//倒序for (int i2 = i1; i2 <= Math.min(N - 1, sum); i2++) {int j1 = sum - i1;int j2 = sum - i2;if (grid[i1][j1] == -1 || grid[i2][j2] == -1) {dp[i1][i2] = Integer.MIN_VALUE;} else {if (i1 != i2 || j1 != j2) {//不重合在同一个点,则获取的最大值=A的格子+B的格子+AB往哪个方向走,也就是上一个状态是怎么来得,dp[i1][i2] = grid[i1][j1] + grid[i2][j2] + Math.max(Math.max(dp[i1][i2 + 1], dp[i1 + 1][i2]), Math.max(dp[i1][i2], dp[i1 + 1][i2 + 1]));} else {dp[i1][i2] = grid[i1][j1] + Math.max(Math.max(dp[i1][i2 + 1], dp[i1 + 1][i2]), Math.max(dp[i1][i2], dp[i1 + 1][i2 + 1]));}}}}}return Math.max(0,dp[0][0]);}
}

Java实现 LeetCode 741 摘樱桃(DFS || 递推 || 传纸条)相关推荐

  1. Leetcode 741. 摘樱桃 C++

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

  2. LeetCode 741. 摘樱桃___贪心算法篇__失败

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

  3. LeetCode 741 摘樱桃(动态规划)

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

  4. LeetCode 741. 摘樱桃(dp)

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

  5. [leetcode]741摘樱桃,动态规划

    题目表明去终点只能往下和往右,回去只能往上和往左,统计路程中经过的樱桃个数,那么就相当于从起点出发两次到终点,但两次路过到的同个樱桃就不能再重复计算,这两次不分先后,同时走深搜,然后用dp表示每个状态 ...

  6. [LeetCode解题报告] 741. 摘樱桃

    [LeetCode解题报告] 741. 摘樱桃 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描述 ...

  7. 【LeetCode】摘樱桃 [H](记忆化搜索)

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

  8. 741.摘樱桃 动态规划

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

  9. 力扣 741. 摘樱桃

    题目来源:https://leetcode.cn/problems/cherry-pickup/ 大致题意: 给定一个二维数组1,其中数组元素由 0,1,-1 表示,有以下含义: 0 表示该位置可以通 ...

  10. 【BZOJ2152】聪聪可可,dfs+递推/点分治

    传送门 写在前面:╯﹏╰ 思路:刚开始char哥在做这个题,提供了不用点分治而是树上递推的做法,然后我就先调出来了-- 对树进行dfs,f[u][y]表示以x为根的子树中,与u距离为y的点(mod 3 ...

最新文章

  1. python学习笔记项目_python学习笔记——肆
  2. 为PHP开发C语言扩展
  3. mysql caching_Spring Caching抽象和Google Guava Cache
  4. Android串口通信apk源码
  5. jupyternotebook虚拟环境无法连接服务_详解pycharm连接远程linux服务器的虚拟环境的方法_python...
  6. nn.Conv2d的解释
  7. keil5函数 默认返回值_python实用技巧——获取部分返回值的4种方式
  8. matlab 雷达工具箱,使用Matlab的工具箱,学习“相控阵雷达技术”
  9. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
  10. TensorFlow实现去噪自编码器(Denoising Autoencoder)
  11. 【号外】来人鸭~ 本公众号招人啦~
  12. DNS在企业网络中的应用(一)
  13. Python编程学习:中兴LTE网管MML命令脚本生成器
  14. 嵌入式软件工程师笔试面试指南目录
  15. 程序员那些必须熬过去的坎!!
  16. 目标检测算法——GHM
  17. 软件工程大作业(完整详细)火车订票管理系统
  18. 浙江杭州工程师职称评审论文要求
  19. 我,27岁,渣本理科男,目前考虑转行python,但又不知道该从何学起......
  20. npm报错Failed at the node-sass@4.14.1 postinstall script

热门文章

  1. python excel 空值_Python/Excel/SPSS/SQL数据处理方法比较之4 - 空值处理
  2. 决策树---使用三种方法对数据建立决策树
  3. Ardunio开发实例-AM2320温湿度传感器
  4. 洛谷P1005 [NOIP2007 提高组] 矩阵取数游戏
  5. 坚果云下载的文件夹在哪_如何建立合理的坚果云文件夹结构?
  6. 申论该怎么学?申论作文如何提高
  7. LG 的数学计划 ---- 第四步 快速幂
  8. deepin系统安装教程(详细)
  9. 同比增长率,环比增长速度、环比发展速度
  10. 史上最好用的Mysql历史数据归档工具