50
50
51
51
<!-- 这里可写通用的实现逻辑 -->
52
52
53
- 动态规划 - 数字三角形模型。
53
+ ** 方法一:动态规划**
54
+
55
+ 线性 DP。
54
56
55
57
类似题型:方格取数、传纸条。
56
58
64
66
class Solution :
65
67
def cherryPickup (self , grid : List[List[int ]]) -> int :
66
68
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 )]
68
71
dp[0 ][0 ][0 ] = grid[0 ][0 ]
69
72
for k in range (1 , (n << 1 ) - 1 ):
70
73
for i1 in range (n):
71
74
for i2 in range (n):
72
75
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 ])
84
87
```
85
88
86
89
### ** Java**
@@ -91,37 +94,31 @@ class Solution:
91
94
class Solution {
92
95
public int cherryPickup (int [][] grid ) {
93
96
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];
100
98
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) {
102
100
for (int i1 = 0 ; i1 < n; ++ i1) {
103
101
for (int i2 = 0 ; i2 < n; ++ i2) {
104
102
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);
118
115
}
119
116
}
120
117
}
121
118
}
122
119
}
123
120
}
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 ]);
125
122
}
126
123
}
127
124
```
@@ -135,30 +132,24 @@ public:
135
132
int n = grid.size();
136
133
vector<vector<vector<int >>> dp(n << 1, vector<vector<int >>(n, vector<int >(n, -1e9)));
137
134
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)
139
136
{
140
137
for (int i1 = 0; i1 < n; ++i1)
141
138
{
142
139
for (int i2 = 0; i2 < n; ++i2)
143
140
{
144
141
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);
158
149
}
159
150
}
160
151
}
161
- return max(dp[ 2 * n - 2] [ n - 1 ] [ n - 1] , 0 );
152
+ return max(0, dp[ n * 2 - 2] [ n - 1 ] [ n - 1] );
162
153
}
163
154
};
164
155
```
@@ -167,51 +158,99 @@ public:
167
158
168
159
```go
169
160
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 );
179
217
}
180
218
}
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
+ );
199
246
}
200
247
}
201
248
}
202
249
}
203
250
}
204
251
}
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
+ };
215
254
```
216
255
217
256
### ** ...**
0 commit comments