You are given an n x n grid representing a field of cherries, each cell is one of three possible integers.
0means the cell is empty, so you can pass through.1means the cell contains a cherry that you can pick up and pass through,or-1means the cell contains a thorn that blocks your way.
Return the maximum number of cherries you can collect 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 value0or1). - 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.

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.
1 | class Solution { |
转化为双人路径
两人同时从
(0,0)出发到(N-1,N-1),两人的路径可以看作是一次往返路径的拆分。动态规划状态定义
定义一个三维动态规划数组
dp[k][x1][x2],表示两个人分别走到(x1,k-x1)和(x2, k-x2)时,能够摘到的最大樱桃数。
- 这里
k表示两个人总共走的步数。y1 = k - x1和y2 = k - x2是两个人在网格中的纵坐标。状态转移方程
两个人每次可以选择向右或向下移动,因此共有4种移动组合:
- 人1向右,人2向右
- 人1向右,人2向下
- 人1向下,人2向右
- 人1向下,人2向下