Skip to content

Commit 5f634d6

Browse files
committed
Runtime: 609 ms (Top 95.65%) | Memory: 24.30 MB (Top 75.94%)
1 parent efc0712 commit 5f634d6

File tree

1 file changed

+23
-55
lines changed

1 file changed

+23
-55
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,27 @@
1+
// Runtime: 609 ms (Top 95.65%) | Memory: 24.30 MB (Top 75.94%)
2+
13
class Solution:
24
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])
3514

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):
5920

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

Comments
 (0)