Skip to content

Commit 0b0b9a5

Browse files
committed
feat: update solutions to lc problem: No.0741
No.0741.Cherry Pickup
1 parent 2b88ff7 commit 0b0b9a5

File tree

7 files changed

+410
-304
lines changed

7 files changed

+410
-304
lines changed

Diff for: solution/0700-0799/0741.Cherry Pickup/README.md

+125-86
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@
5050

5151
<!-- 这里可写通用的实现逻辑 -->
5252

53-
动态规划 - 数字三角形模型。
53+
**方法一:动态规划**
54+
55+
线性 DP。
5456

5557
类似题型:方格取数、传纸条。
5658

@@ -64,23 +66,24 @@
6466
class Solution:
6567
def cherryPickup(self, grid: List[List[int]]) -> int:
6668
n = len(grid)
67-
dp = [[[float('-inf')] * n for _ in range(n)] for _ in range((n << 1) -1 )]
69+
dp = [[[float('-inf')] * n for _ in range(n)]
70+
for _ in range((n << 1) - 1)]
6871
dp[0][0][0] = grid[0][0]
6972
for k in range(1, (n << 1) - 1):
7073
for i1 in range(n):
7174
for i2 in range(n):
7275
j1, j2 = k - i1, k - i2
73-
if j1 >= 0 and j1 < n and j2 >= 0 and j2 < n:
74-
if grid[i1][j1] == -1 or grid[i2][j2] == -1:
75-
continue
76-
t = grid[i1][j1]
77-
if i1 != i2:
78-
t += grid[i2][j2]
79-
for p1 in range(i1 - 1, i1 + 1):
80-
for p2 in range(i2 - 1, i2 + 1):
81-
if p1 >= 0 and p2 >= 0:
82-
dp[k][i1][i2] = max(dp[k][i1][i2], dp[k - 1][p1][p2] + t)
83-
return max(dp[-1][-1][-1], 0)
76+
if not 0 <= j1 < n or not 0 <= j2 < n or grid[i1][j1] == -1 or grid[i2][j2] == -1:
77+
continue
78+
t = grid[i1][j1]
79+
if i1 != i2:
80+
t += grid[i2][j2]
81+
for x1 in range(i1 - 1, i1 + 1):
82+
for x2 in range(i2 - 1, i2 + 1):
83+
if x1 >= 0 and x2 >= 0:
84+
dp[k][i1][i2] = max(
85+
dp[k][i1][i2], dp[k - 1][x1][x2] + t)
86+
return max(0, dp[-1][-1][-1])
8487
```
8588

8689
### **Java**
@@ -91,37 +94,31 @@ class Solution:
9194
class Solution {
9295
public int cherryPickup(int[][] grid) {
9396
int n = grid.length;
94-
int[][][] dp = new int[2 * n][n][n];
95-
for (int[][] item : dp) {
96-
for (int[] row : item) {
97-
Arrays.fill(row, Integer.MIN_VALUE);
98-
}
99-
}
97+
int[][][] dp = new int[n * 2][n][n];
10098
dp[0][0][0] = grid[0][0];
101-
for (int k = 1; k < 2 * n - 1; ++k) {
99+
for (int k = 1; k < n * 2 - 1; ++k) {
102100
for (int i1 = 0; i1 < n; ++i1) {
103101
for (int i2 = 0; i2 < n; ++i2) {
104102
int j1 = k - i1, j2 = k - i2;
105-
if (j1 >= 0 && j1 < n && j2 >= 0 && j2 < n) {
106-
if (grid[i1][j1] == -1 || grid[i2][j2] == -1) {
107-
continue;
108-
}
109-
int t = grid[i1][j1];
110-
if (i1 != i2) {
111-
t += grid[i2][j2];
112-
}
113-
for (int p1 = i1 - 1; p1 <= i1; ++p1) {
114-
for (int p2 = i2 - 1; p2 <= i2; ++p2) {
115-
if (p1 >= 0 && p2 >= 0) {
116-
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k - 1][p1][p2] + t);
117-
}
103+
dp[k][i1][i2] = Integer.MIN_VALUE;
104+
if (j1 < 0 || j1 >= n || j2 < 0 || j2 >= n || grid[i1][j1] == -1 || grid[i2][j2] == -1) {
105+
continue;
106+
}
107+
int t = grid[i1][j1];
108+
if (i1 != i2) {
109+
t += grid[i2][j2];
110+
}
111+
for (int x1 = i1 - 1; x1 <= i1; ++x1) {
112+
for (int x2 = i2 - 1; x2 <= i2; ++x2) {
113+
if (x1 >= 0 && x2 >= 0) {
114+
dp[k][i1][i2] = Math.max(dp[k][i1][i2], dp[k - 1][x1][x2] + t);
118115
}
119116
}
120117
}
121118
}
122119
}
123120
}
124-
return Math.max(dp[2 * n - 2][n - 1][n - 1], 0);
121+
return Math.max(0, dp[n * 2 - 2][n - 1][n - 1]);
125122
}
126123
}
127124
```
@@ -135,30 +132,24 @@ public:
135132
int n = grid.size();
136133
vector<vector<vector<int>>> dp(n << 1, vector<vector<int>>(n, vector<int>(n, -1e9)));
137134
dp[0][0][0] = grid[0][0];
138-
for (int k = 1; k < 2 * n - 1; ++k)
135+
for (int k = 1; k < n * 2 - 1; ++k)
139136
{
140137
for (int i1 = 0; i1 < n; ++i1)
141138
{
142139
for (int i2 = 0; i2 < n; ++i2)
143140
{
144141
int j1 = k - i1, j2 = k - i2;
145-
if (j1 >= 0 && j1 < n && j2 >= 0 && j2 < n)
146-
{
147-
if (grid[i1][j1] == -1 || grid[i2][j2] == -1) continue;
148-
int t = grid[i1][j1];
149-
if (i1 != i2) t += grid[i2][j2];
150-
for (int p1 = i1 - 1; p1 <= i1; ++p1)
151-
{
152-
for (int p2 = i2 - 1; p2 <= i2; ++p2)
153-
{
154-
if (p1 >= 0 && p2 >= 0) dp[k][i1][i2] = max(dp[k][i1][i2], dp[k - 1][p1][p2] + t);
155-
}
156-
}
157-
}
142+
if (j1 < 0 || j1 >= n || j2 < 0 || j2 >= n || grid[i1][j1] == -1 || grid[i2][j2] == -1) continue;
143+
int t = grid[i1][j1];
144+
if (i1 != i2) t += grid[i2][j2];
145+
for (int x1 = i1 - 1; x1 <= i1; ++x1)
146+
for (int x2 = i2 - 1; x2 <= i2; ++x2)
147+
if (x1 >= 0 && x2 >= 0)
148+
dp[k][i1][i2] = max(dp[k][i1][i2], dp[k - 1][x1][x2] + t);
158149
}
159150
}
160151
}
161-
return max(dp[2 * n - 2][n - 1][n - 1], 0);
152+
return max(0, dp[n * 2 - 2][n - 1][n - 1]);
162153
}
163154
};
164155
```
@@ -167,51 +158,99 @@ public:
167158
168159
```go
169160
func cherryPickup(grid [][]int) int {
170-
n := len(grid)
171-
dp := make([][][]int, (n << 1) - 1)
172-
for i := range dp {
173-
dp[i] = make([][]int, n)
174-
for j := range dp[i] {
175-
dp[i][j] = make([]int, n)
176-
for k := range dp[i][j] {
177-
dp[i][j][k] = int(-1e9)
178-
}
161+
n := len(grid)
162+
dp := make([][][]int, (n<<1)-1)
163+
for i := range dp {
164+
dp[i] = make([][]int, n)
165+
for j := range dp[i] {
166+
dp[i][j] = make([]int, n)
167+
}
168+
}
169+
dp[0][0][0] = grid[0][0]
170+
for k := 1; k < (n<<1)-1; k++ {
171+
for i1 := 0; i1 < n; i1++ {
172+
for i2 := 0; i2 < n; i2++ {
173+
dp[k][i1][i2] = int(-1e9)
174+
j1, j2 := k-i1, k-i2
175+
if j1 < 0 || j1 >= n || j2 < 0 || j2 >= n || grid[i1][j1] == -1 || grid[i2][j2] == -1 {
176+
continue
177+
}
178+
t := grid[i1][j1]
179+
if i1 != i2 {
180+
t += grid[i2][j2]
181+
}
182+
for x1 := i1 - 1; x1 <= i1; x1++ {
183+
for x2 := i2 - 1; x2 <= i2; x2++ {
184+
if x1 >= 0 && x2 >= 0 {
185+
dp[k][i1][i2] = max(dp[k][i1][i2], dp[k-1][x1][x2]+t)
186+
}
187+
}
188+
}
189+
}
190+
}
191+
}
192+
return max(0, dp[n*2-2][n-1][n-1])
193+
}
194+
195+
func max(a, b int) int {
196+
if a > b {
197+
return a
198+
}
199+
return b
200+
}
201+
```
202+
203+
### **JavaScript**
204+
205+
```js
206+
/**
207+
* @param {number[][]} grid
208+
* @return {number}
209+
*/
210+
var cherryPickup = function (grid) {
211+
const n = grid.length;
212+
let dp = new Array(n * 2 - 1);
213+
for (let k = 0; k < dp.length; ++k) {
214+
dp[k] = new Array(n);
215+
for (let i = 0; i < n; ++i) {
216+
dp[k][i] = new Array(n).fill(-1e9);
179217
}
180218
}
181-
dp[0][0][0] = grid[0][0]
182-
for k := 1; k < (n << 1) - 1; k++ {
183-
for i1 := 0; i1 < n; i1++ {
184-
for i2 := 0; i2 < n; i2++ {
185-
j1, j2 := k - i1, k - i2
186-
if j1 >= 0 && j1 < n && j2 >= 0 && j2 < n {
187-
if grid[i1][j1] == -1 || grid[i2][j2] == -1 {
188-
continue
189-
}
190-
t := grid[i1][j1]
191-
if i1 != i2 {
192-
t += grid[i2][j2]
193-
}
194-
for p1 := i1 - 1; p1 <= i1; p1++ {
195-
for p2 := i2 - 1; p2 <= i2; p2++ {
196-
if p1 >= 0 && p2 >= 0 {
197-
dp[k][i1][i2] = max(dp[k][i1][i2], dp[k - 1][p1][p2] + t)
198-
}
219+
dp[0][0][0] = grid[0][0];
220+
for (let k = 1; k < n * 2 - 1; ++k) {
221+
for (let i1 = 0; i1 < n; ++i1) {
222+
for (let i2 = 0; i2 < n; ++i2) {
223+
const j1 = k - i1,
224+
j2 = k - i2;
225+
if (
226+
j1 < 0 ||
227+
j1 >= n ||
228+
j2 < 0 ||
229+
j2 >= n ||
230+
grid[i1][j1] == -1 ||
231+
grid[i2][j2] == -1
232+
) {
233+
continue;
234+
}
235+
let t = grid[i1][j1];
236+
if (i1 != i2) {
237+
t += grid[i2][j2];
238+
}
239+
for (let x1 = i1 - 1; x1 <= i1; ++x1) {
240+
for (let x2 = i2 - 1; x2 <= i2; ++x2) {
241+
if (x1 >= 0 && x2 >= 0) {
242+
dp[k][i1][i2] = Math.max(
243+
dp[k][i1][i2],
244+
dp[k - 1][x1][x2] + t,
245+
);
199246
}
200247
}
201248
}
202249
}
203250
}
204251
}
205-
206-
return max(dp[(n << 1) - 2][n - 1][n - 1], 0)
207-
}
208-
209-
func max(a, b int) int {
210-
if a > b {
211-
return a
212-
}
213-
return b
214-
}
252+
return Math.max(0, dp[n * 2 - 2][n - 1][n - 1]);
253+
};
215254
```
216255

217256
### **...**

0 commit comments

Comments
 (0)