LeetCode 741. Cherry Pickup
原题链接在这里: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 anN
byN
2D array, with1 <= 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:
1 class Solution { 2 int [][][] dp; 3 int n; 4 public int cherryPickup(int[][] grid) { 5 if(grid == null || grid.length == 0 || grid[0].length == 0){ 6 return 0; 7 } 8 9 n = grid.length; 10 dp = new int[n][n][n]; 11 for(int i = 0; i<n; i++){ 12 for(int j = 0; j<n; j++){ 13 Arrays.fill(dp[i][j], Integer.MIN_VALUE); 14 } 15 } 16 17 return Math.max(0, dfs(grid, n-1, n-1, n-1)); 18 } 19 20 private int dfs(int [][] grid, int x1, int y1, int x2){ 21 int y2 = x1+y1-x2; 22 if(x1<0 || y1<0 || x2<0 || y2<0){ 23 return -1; 24 } 25 26 if(grid[x1][y1]<0 || grid[x2][y2]<0){ 27 return -1; 28 } 29 30 if(dp[x1][y1][x2] != Integer.MIN_VALUE){ 31 return dp[x1][y1][x2]; 32 } 33 34 if(x1==0 && y1==0){ 35 dp[0][0][0] = grid[0][0]; 36 return grid[0][0]; 37 } 38 39 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))); 40 if(res < 0){ 41 dp[x1][y1][x2] = -1; 42 return -1; 43 } 44 45 res += grid[x1][y1]; 46 if(x1 != x2){ 47 res += grid[x2][y2]; 48 } 49 50 dp[x1][y1][x2] = res; 51 return res; 52 } 53 }
原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/11653409.html
- Shell脚本的简单排错法及调试程序bashdb
- ASM 翻译系列第二十四弹:ASM Internal ASM files number 10 and 11
- Redhat设置NFS挂载的简单步骤
- WordPress后台首页显示RSS错误的解决办法
- ASM 翻译系列第十九弹:ASM Internal ASM Continuing Operations Directory
- ASM 翻译系列第二十五弹:ASM 高级知识 When will my rebalance complete
- ASM 翻译系列第二十六弹:ASM 高级知识 Where is my data
- LVS+Keepalived负载均衡主备&双主架构全攻略
- ASM 翻译系列第二十八弹:ASM INTERNAL Partnership and Status Table
- ASM 翻译系列第二十九弹:ASM INTERNAL Free Space Table
- MySql常用30种SQL查询语句优化方法
- RxJS速成
- 会HTML/CSS就可以轻松创建网站
- 区块链银行应用探索(Hyperledger fabric)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaSE面试深度剖析 第一讲
- JavaSE面试深度剖析 第二讲
- JavaSE面试深度剖析 第三讲
- docker+consul+ nginx集成分布式的服务发现与注册架构
- CWFF:一款针对模糊测试的自定义字典工具
- HMM、信号、时序、降噪(附代码)
- 原创 | 图解git,用手绘图带你理解git中分支的原理和应用
- Android 天气APP(二十四)地图天气(上)自动定位和地图点击定位
- 3分钟短文:可能是Laravel模板最直白的用法了,没有之一
- Android 天气APP(二十三)增加灾害预警、优化主页面UI
- Android 天气APP(二十一)滑动改变UI、增加更多天气数据展示,最多未来15天天气预报
- Android 读取csv格式数据文件
- Android LitePal的简单使用
- Android RecyclerVIew列表使用 (编辑、单选、全选、删除、动画效果+附源码)
- Android TV 焦点控制