Hard
You are given a rows x cols
matrix grid
representing a field of cherries where grid[i][j]
represents the number of cherries that you can collect from the (i, j)
cell.
You have two robots that can collect cherries for you:
(0, 0)
, and(0, cols - 1)
.Return the maximum number of cherries collection using both robots by following the rules below:
(i, j)
, robots can move to cell (i + 1, j - 1)
, (i + 1, j)
, or (i + 1, j + 1)
.grid
.Example 1:
Input: grid = [[3,1,1],[2,5,1],[1,5,5],[2,1,1]]
Output: 24
Explanation: Path of robot #1 and #2 are described in color green and blue respectively.
Cherries taken by Robot #1, (3 + 2 + 5 + 2) = 12.
Cherries taken by Robot #2, (1 + 5 + 5 + 1) = 12.
Total of cherries: 12 + 12 = 24.
Example 2:
Input: grid = [[1,0,0,0,0,0,1],[2,0,0,0,0,3,0],[2,0,9,0,0,0,0],[0,3,0,5,4,0,0],[1,0,2,3,0,0,6]]
Output: 28
Explanation: Path of robot #1 and #2 are described in color green and blue respectively.
Cherries taken by Robot #1, (1 + 9 + 5 + 2) = 17.
Cherries taken by Robot #2, (1 + 3 + 4 + 3) = 11.
Total of cherries: 17 + 11 = 28.
Constraints:
rows == grid.length
cols == grid[i].length
2 <= rows, cols <= 70
0 <= grid[i][j] <= 100
class Solution {
fun cherryPickup(grid: Array<IntArray>): Int {
val m = grid.size
val n = grid[0].size
val dp = Array(n) { Array(n) { IntArray(m) } }
dp[0][n - 1][0] = grid[0][0] + grid[0][n - 1]
for (k in 1 until m) {
for (i in 0..Math.min(n - 1, k)) {
for (j in n - 1 downTo Math.max(0, n - 1 - k)) {
dp[i][j][k] = maxOfLast(dp, i, j, k) + grid[k][i] + if (i == j) 0 else grid[k][j]
}
}
}
var result = 0
for (i in 0..Math.min(n - 1, m)) {
for (j in n - 1 downTo Math.max(0, n - 1 - m)) {
result = Math.max(result, dp[i][j][m - 1])
}
}
return result
}
private fun maxOfLast(dp: Array<Array<IntArray>>, i: Int, j: Int, k: Int): Int {
var result = 0
for (x in -1..1) {
for (y in -1..1) {
val r = i + x
val c = j + y
if (r >= 0 && r < dp[0].size && c >= 0 && c < dp[0].size) {
result = Math.max(result, dp[r][c][k - 1])
}
}
}
return result
}
}