1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public: int cherryPickup(vector<vector<int>>& grid) { int n = grid.size(); vector<vector<vector<int>>> cache(n, vector<vector<int>>(n, vector<int>(n, INT_MIN))); return max(0, dfs(grid, 0, 0, 0, cache)); }
int dfs(const vector<vector<int>> &grid, int r1, int c1, int r2, vector<vector<vector<int>>> &cache) { int n = grid.size(); int c2 = r1 + c1 - r2; if (r1 == n || c1 == n || r2 == n || c2 == n || grid[r1][c1] == -1 || grid[r2][c2] == -1) return INT_MIN; if (r1 == n - 1 && c1 == n - 1) return grid[r1][c1]; if (cache[r1][c1][r2] != INT_MIN) return cache[r1][c1][r2]; int res = grid[r1][c1] + (r1 == r2 ? 0 : grid[r2][c2]); res += max({dfs(grid, r1 + 1, c1, r2 + 1, cache), dfs(grid, r1, c1 + 1, r2, cache), dfs(grid, r1 + 1, c1, r2, cache), dfs(grid, r1, c1 + 1, r2 + 1, cache)}); return cache[r1][c1][r2] = res; } };
|