题目
Given a rows x cols matrix grid representing a field of cherries. Each cell in grid represents the number of cherries that you can collect.
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) of the grid.
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 is passing through a cell, It picks it up all cherries, and the cell becomes an empty cell (0).
 - When both robots stay on the same cell, only one of them takes the cherries.
 - Both robots cannot move outside of the grid at any moment.
 - Both robots should reach the bottom row in the grid.
 
解题思路
dp[i][j1][j2]表示从第i行,一个机器人在j1位置,一个在j2位置,走到最后一行可以拿到的最大值,dp[0][0][n-1]为所求
dp[i][j1][j2] = max(dp[i+1][d1][d2]) + grid[i][j1] + grid[j][j2]
    d1 = [j1-1, j1, j1+1]
    d2 = [j2-1, j2, j2+1]
    0 <= d1, d2 < n
    d1 < d2 (通过保持让左边的机器人一直在左边,进行优化)
边界:dp[m-1][j1][j2] = grid[m-1][j1] + grid[m-1][j2]
代码
class Solution:
    def cherryPickup(self, grid: List[List[int]]) -> int:
        @lru_cache(None)
        def dfs(i, j1, j2):
            if i == m - 1:
                return grid[i][j1] + grid[i][j2]
            ret = 0
            for d1 in [j1 - 1, j1, j1 + 1]:
                for d2 in [j2 - 1, j2, j2 + 1]:
                    if d1 < d2 and 0 <= d1 < n and 0 <= d2 < n:
                        ret = max(ret, dfs(i + 1, d1, d2))
            return ret + grid[i][j1] + grid[i][j2]
        
        m, n = len(grid), len(grid[0])
        return dfs(0, 0, n - 1)