|
| 1 | +// Runtime: 609 ms (Top 95.65%) | Memory: 24.30 MB (Top 75.94%) |
| 2 | + |
1 | 3 | class Solution:
|
2 | 4 | def cherryPickup(self, grid: List[List[int]]) -> int:
|
3 |
| - # 3-D DP |
4 |
| - # dp Approach |
5 |
| - # Bottom-Up |
6 |
| - r=len(grid) |
7 |
| - c=len(grid[0]) |
8 |
| - dp=[[[0 for _ in range(c)] for _ in range(c)] for _ in range(r)] |
9 |
| - for i in range(r): |
10 |
| - for j1 in range(c): |
11 |
| - for j2 in range(c): |
12 |
| - if i==r-1 and j1==j2: |
13 |
| - dp[i][j1][j2]=grid[i][j1] |
14 |
| - elif(i==r-1): |
15 |
| - dp[i][j1][j2]=grid[i][j1]+grid[i][j2] |
16 |
| - for i in range(r-2,-1,-1): |
17 |
| - for j1 in range(c): |
18 |
| - for j2 in range(c): |
19 |
| - maxi=-float('inf') |
20 |
| - for dj1 in range(-1,2): |
21 |
| - for dj2 in range(-1,2): |
22 |
| - if j1==j2: |
23 |
| - value=grid[i][j1] |
24 |
| - else: |
25 |
| - value=grid[i][j1]+grid[i][j2] |
26 |
| - if j1+dj1>=0 and j1+dj1<c and j2+dj2>=0 and j2+dj2<c: |
27 |
| - value+=dp[i+1][j1+dj1][j2+dj2] |
28 |
| - else: |
29 |
| - value=-float('inf') |
30 |
| - maxi=max(maxi,value) |
31 |
| - dp[i][j1][j2]=maxi |
32 |
| - return dp[0][0][c-1] |
33 |
| - |
34 |
| -# Memoization |
| 5 | + rows, cols = len(grid), len(grid[0]) |
| 6 | + |
| 7 | + dp = [[[0]*(cols + 2) for _ in range(cols + 2)] for _ in range(rows + 1)] |
| 8 | + |
| 9 | + def get_next_max(row, col_r1, col_r2): |
| 10 | + res = 0 |
| 11 | + for next_col_r1 in (col_r1 - 1, col_r1, col_r1 + 1): |
| 12 | + for next_col_r2 in (col_r2 - 1, col_r2, col_r2 + 1): |
| 13 | + res = max(res, dp[row + 1][next_col_r1 + 1][next_col_r2 + 1]) |
35 | 14 |
|
36 |
| - r=len(grid) |
37 |
| - c=len(grid[0]) |
38 |
| - def solve(i,j1,j2): |
39 |
| - dp=[[[-1 for _ in range(c)] for _ in range(c)] for _ in range(r)] |
40 |
| - if j1<0 or j1>=c or j2<0 or j2>=c: |
41 |
| - return -float('inf') |
42 |
| - if i==r-1: |
43 |
| - if j1==j2: |
44 |
| - return grid[i][j1] |
45 |
| - else: |
46 |
| - return grid[i][j1]+grid[i][j2] |
47 |
| - maxi=-float('inf') |
48 |
| - if dp[i][j1][j2]!=-1: |
49 |
| - return dp[i][j1][j2] |
50 |
| - for dj1 in range(-1,2): |
51 |
| - for dj2 in range(-1,2): |
52 |
| - if j1==j2: |
53 |
| - maxi=max(maxi,grid[i][j1]+solve(i+1,j1+dj1,j2+dj2)) |
54 |
| - else: |
55 |
| - maxi=max(maxi,grid[i][j1]+grid[i][j2]+solve(i+1,j1+dj1,j2+dj2)) |
56 |
| - dp[i][j1][j2]=maxi |
57 |
| - return dp[i][j1][j2] |
58 |
| - return solve(0,0,c-1) |
| 15 | + return res |
| 16 | + |
| 17 | + for row in reversed(range(rows)): |
| 18 | + for col_r1 in range(min(cols, row + 2)): |
| 19 | + for col_r2 in range(max(0, cols - row - 1), cols): |
59 | 20 |
|
| 21 | + reward = grid[row][col_r1] + grid[row][col_r2] |
| 22 | + if col_r1 == col_r2: |
| 23 | + reward /= 2 |
| 24 | + |
| 25 | + dp[row][col_r1 + 1][col_r2 + 1] = reward + get_next_max(row, col_r1, col_r2) |
| 26 | + |
| 27 | + return dp[0][1][cols] |
0 commit comments