一个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。

思路:典型的双线dp题,因为我们可以一来一回,但是这样有点麻烦,我们可以考虑把一来一回看做从出发点选择则两条路径到达终点的问题,这样就好做很多了,我们定义dp[i][j][k]:表示第一个人走到(i,j)并且第二个人的横坐标为k时摘樱桃的最大数量,第二个人的纵坐标不就是i+j-k嘛。。。很简单的!

class Solution {public int cherryPickup(int[][] grid) {int n=grid.length;int[][][] dp=new int[n+1][n+1][n+1];for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)for(int k=0;k<=n;k++)dp[i][j][k]=Integer.MIN_VALUE;dp[0][0][0]=dp[0][1][0]=dp[0][1][1]=dp[1][0][0]=dp[1][0][1]=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int k=0;k<n;k++) {int h=i+j-k;if(h<0 || h>=n || grid[i][j]<0 || grid[k][h]<0) {dp[i+1][j+1][k+1]=Integer.MIN_VALUE;continue;}dp[i+1][j+1][k+1]=Math.max(Math.max(dp[i][j+1][k+1], dp[i+1][j][k+1]), Math.max(dp[i][j+1][k], dp[i+1][j][k]))+grid[i][j];if(i!=k) dp[i+1][j+1][k+1]+=grid[k][h];}return Math.max(0, dp[n][n][n]);}
}

JAVA程序设计:摘樱桃(LeetCode:741)相关推荐

  1. LeetCode刷题:741. Cherry Pickup —摘樱桃 动态规划

    LeetCode刷题:741. Cherry Pickup -摘樱桃 动态规划 原题链接:https://leetcode.com/problems/cherry-pickup/ In a N x N ...

  2. Leetcode 741. 摘樱桃 C++

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

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

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

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

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

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

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

  6. 741.摘樱桃 动态规划

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

  7. 力扣 741. 摘樱桃

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

  8. java开发网站学年论文,《Java程序设计》教学网站的设计【毕业论文】.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava <Java程序设计>教学网站的设计[毕业论 ...

  9. Java程序设计编程题目

    Java程序设计编程题目 一般题: 1. 编写一个应用程序,对程序中给定的四个double型数据求其最大值和最小值. import java.util.*; public class no1 { pu ...

最新文章

  1. 以金山界面库(openkui)为例思考和分析界面库的设计和实现——问题
  2. 一篇博客带你轻松应对java面试中的多线程与高并发
  3. Toolbar+DrawerLayout
  4. arm引脚复用linux,ARM知识分享-i.MX6Q GPIO复用修改方法
  5. 【2018.3.10】模拟赛之四-ssl2133 腾讯大战360【SPAF,图论,最短路径】
  6. exec go 重启_无停机优雅重启 Go 程序
  7. AntDesignUI - V3.0 技术手册(资源篇)
  8. 2019年开源安全现状调查报告发布
  9. dev代码拷贝中文乱码的解决方案
  10. ifonts下载ttf字体文件
  11. 苹果电脑教程之退出ID账号
  12. React新手入门学习
  13. VoLTE用户码号和卡
  14. mysql两个日期相减,得到相差的天数
  15. Google 开源的项目集合
  16. 设置透明色有残留怎么办_AE崩溃了怎么办?这可能是最全面的解决办法了!
  17. 微信小程序 —— 模块化方法的总结
  18. 【JNLP】什么是JNLP
  19. 【嵌入式烧录/刷写文件】-3.1-详解二进制Bin格式文件
  20. 著名的Oracle公司中文名字为什么叫“甲骨文”?

热门文章

  1. Linux error函数 ——Linux编程
  2. 全能数据分析工具:Tableau Desktop 2019 for Mac
  3. jquery.qrcode.js生成二维码插件转成图片格式
  4. 北大公开课老师整理出的Java必备知识(建议收藏)
  5. 电子科技大学微处理器与嵌入式实验报告实验四五
  6. 洪飞计算机百度云,海天名师洪飞解读2011计算机考研大纲
  7. 使用 nGlide 和 dgVoodoo2 玩经典 3DFX 游戏
  8. HFSS边界条件:理想匹配层(PML)
  9. [转]Theano下用CNN(卷积神经网络)做车牌中文字符OCR
  10. java jolt调用tuxedo_Java通过Jolt调用Tuxedo服务 zz