> ## Documentation Index
> Fetch the complete documentation index at: https://leetcode-py.wisl.dev/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> leetcode-py is a Python LeetCode practice environment generator with one CLI: lcpy. It is not a service or platform.
> Each problem is a directory under leetcode/ with README.md, solution.py, test_solution.py, helpers.py, and playground.ipynb. lcpy gen creates them from JSON templates bundled with the package.
> Examples are backed by tests; copy them verbatim.

# Cherry Pickup II Python Solution with Tests

> Tested Python solution for LeetCode 1463 with 18 pytest cases. Generate a practice environment with lcpy.

LeetCode 1463, [Hard](/catalog/hard). Topics: [Array](/catalog/topics/array), [Dynamic Programming](/catalog/topics/dynamic-programming), [Matrix](/catalog/topics/matrix). [View on LeetCode](https://leetcode.com/problems/cherry-pickup-ii/description/).

Generate this problem as a practice environment: tested reference solution, 18 [parametrized pytest cases](/practice/testing), and a playground notebook:

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
lcpy gen -n 1463   # by problem number
lcpy gen -s cherry_pickup_ii   # by problem name
```

## Problem

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:

* **Robot #1** is located at the **top-left corner** `(0, 0)`, and
* **Robot #2** is located at the **top-right corner** `(0, cols - 1)`.

Return *the maximum number of cherries collection using both robots by following the rules below*:

* From a cell `(i, j)`, robots can move to cell `(i + 1, j - 1)`, `(i + 1, j)`, or `(i + 1, j + 1)`.
* When any robot passes through a cell, It picks up all cherries, and the cell becomes an empty cell.
* When both robots stay in the same cell, only one takes the cherries.
* Both robots cannot move outside of the grid at any moment.
* Both robots should reach the bottom row in `grid`.

### Examples

![Example 1](https://assets.leetcode.com/uploads/2020/04/29/sample_1_1802.png)

```
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](https://assets.leetcode.com/uploads/2020/04/23/sample_2_1802.png)

```
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

## Solution

Reference implementation from [solution.py on GitHub](https://github.com/wislertt/leetcode-py/blob/main/leetcode/cherry_pickup_ii/solution.py), full suite in [test\_solution.py](https://github.com/wislertt/leetcode-py/blob/main/leetcode/cherry_pickup_ii/test_solution.py):

```python theme={"theme":{"light":"github-light","dark":"github-dark"}}
class Solution:
    # Time: O(rows * cols^2)
    # Space: O(cols^2)
    def cherry_pickup(self, grid: list[list[int]]) -> int:
        rows, cols = len(grid), len(grid[0])
        cols_sq = cols * cols
        # -1 marks unreachable (col, col) state pairs.
        prev = [-1] * cols_sq
        prev[cols - 1] = grid[0][0] + grid[0][cols - 1]
        for row in range(1, rows):
            cur = [-1] * cols_sq
            row_grid = grid[row]
            for c1 in range(cols):
                for c2 in range(cols):
                    best = -1
                    for d1 in (-1, 0, 1):
                        p1 = c1 + d1
                        if p1 < 0 or p1 >= cols:
                            continue
                        for d2 in (-1, 0, 1):
                            p2 = c2 + d2
                            if p2 < 0 or p2 >= cols:
                                continue
                            val = prev[p1 * cols + p2]
                            if val > best:
                                best = val
                    if best < 0:
                        continue
                    gain = row_grid[c1] + (row_grid[c2] if c1 != c2 else 0)
                    cur[c1 * cols + c2] = best + gain
            prev = cur
        return max(prev)
```

## Complexity

| Time | Space |
| - | - |
| O(rows \* cols^2) | O(cols^2) |

## Tags

[NeetCode All](/catalog/neetcode).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.