79
79
80
80
我们可以将方法一中的记忆化搜索改为动态规划。
81
81
82
- 先将会议排序,这次我们按照结束时间从小到大排序。然后定义 $dp [ i] [ j ] $ 表示前 $i$ 个会议中,最多参加 $j$ 个会议的最大价值和。答案即为 $dp [ n] [ k ] $。
82
+ 先将会议排序,这次我们按照结束时间从小到大排序。然后定义 $f [ i] [ j ] $ 表示前 $i$ 个会议中,最多参加 $j$ 个会议的最大价值和。答案即为 $f [ n] [ k ] $。
83
83
84
- 对于第 $i$ 个会议,我们可以选择参加或者不参加。如果不参加,那么最大价值和就是 $dp [ i] [ j ] $,如果参加,我们可以通过二分查找,找到最后一个结束时间小于第 $i$ 个会议开始时间的会议,记为 $h$,那么最大价值和就是 $dp [ h+1] [ j - 1 ] + value[ i] $。取二者的较大值即可。即:
84
+ 对于第 $i$ 个会议,我们可以选择参加或者不参加。如果不参加,那么最大价值和就是 $f [ i] [ j ] $,如果参加,我们可以通过二分查找,找到最后一个结束时间小于第 $i$ 个会议开始时间的会议,记为 $h$,那么最大价值和就是 $f [ h+1] [ j - 1 ] + value[ i] $。取二者的较大值即可。即:
85
85
86
86
$$
87
- dp [i+1][j] = \max(dp [i][j], dp [h+1][j - 1] + value[i])
87
+ f [i+1][j] = \max(f [i][j], f [h+1][j - 1] + value[i])
88
88
$$
89
89
90
90
其中 $h$ 为最后一个结束时间小于第 $i$ 个会议开始时间的会议,可以通过二分查找得到。
106
106
class Solution :
107
107
def maxValue (self , events : List[List[int ]], k : int ) -> int :
108
108
@cache
109
- def dfs (i , k ) :
109
+ def dfs (i : int , k : int ) -> int :
110
110
if i >= len (events):
111
111
return 0
112
- _, e, v = events[i]
112
+ _, ed, val = events[i]
113
113
ans = dfs(i + 1 , k)
114
114
if k:
115
- j = bisect_right(events, e , lo = i+ 1 , key = lambda x : x[0 ])
116
- ans = max (ans, dfs(j, k - 1 ) + v )
115
+ j = bisect_right(events, ed , lo = i + 1 , key = lambda x : x[0 ])
116
+ ans = max (ans, dfs(j, k - 1 ) + val )
117
117
return ans
118
-
118
+
119
119
events.sort()
120
120
return dfs(0 , k)
121
121
```
@@ -125,12 +125,12 @@ class Solution:
125
125
def maxValue (self , events : List[List[int ]], k : int ) -> int :
126
126
events.sort(key = lambda x : x[1 ])
127
127
n = len (events)
128
- dp = [[0 ] * (k + 1 ) for _ in range (n + 1 )]
129
- for i, (s , _, v ) in enumerate (events):
130
- h = bisect_left(events, s , hi = i, key = lambda x : x[1 ])
128
+ f = [[0 ] * (k + 1 ) for _ in range (n + 1 )]
129
+ for i, (st , _, val ) in enumerate (events, 1 ):
130
+ p = bisect_left(events, st , hi = i - 1 , key = lambda x : x[1 ])
131
131
for j in range (1 , k + 1 ):
132
- dp[i + 1 ][j] = max (dp[i ][j], dp[h ][j - 1 ] + v )
133
- return dp [n][k]
132
+ f[i ][j] = max (f[i - 1 ][j], f[p ][j - 1 ] + val )
133
+ return f [n][k]
134
134
```
135
135
136
136
### ** Java**
@@ -160,21 +160,20 @@ class Solution {
160
160
}
161
161
int j = search(events, events[i][1 ], i + 1 );
162
162
int ans = Math . max(dfs(i + 1 , k), dfs(j, k - 1 ) + events[i][2 ]);
163
- f[i][k] = ans;
164
- return ans;
163
+ return f[i][k] = ans;
165
164
}
166
165
167
- private int search (int [][] events , int x , int i ) {
168
- int left = i, right = n;
169
- while (left < right ) {
170
- int mid = (left + right ) >> 1 ;
166
+ private int search (int [][] events , int x , int lo ) {
167
+ int l = lo, r = n;
168
+ while (l < r ) {
169
+ int mid = (l + r ) >> 1 ;
171
170
if (events[mid][0 ] > x) {
172
- right = mid;
171
+ r = mid;
173
172
} else {
174
- left = mid + 1 ;
173
+ l = mid + 1 ;
175
174
}
176
175
}
177
- return left ;
176
+ return l ;
178
177
}
179
178
}
180
179
```
@@ -184,28 +183,28 @@ class Solution {
184
183
public int maxValue (int [][] events , int k ) {
185
184
Arrays . sort(events, (a, b) - > a[1 ] - b[1 ]);
186
185
int n = events. length;
187
- int [][] dp = new int [n + 1 ][k + 1 ];
188
- for (int i = 0 ; i < n; ++ i) {
189
- int s = events[i][0 ], v = events[i][2 ];
190
- int h = search(events, s , i);
186
+ int [][] f = new int [n + 1 ][k + 1 ];
187
+ for (int i = 1 ; i <= n; ++ i) {
188
+ int st = events[i - 1 ][0 ], val = events[i - 1 ][2 ];
189
+ int p = search(events, st , i - 1 );
191
190
for (int j = 1 ; j <= k; ++ j) {
192
- dp[i + 1 ][j] = Math . max(dp[i ][j], dp[h ][j - 1 ] + v );
191
+ f[i ][j] = Math . max(f[i - 1 ][j], f[p ][j - 1 ] + val );
193
192
}
194
193
}
195
- return dp [n][k];
194
+ return f [n][k];
196
195
}
197
196
198
- private int search (int [][] events , int x , int n ) {
199
- int left = 0 , right = n ;
200
- while (left < right ) {
201
- int mid = (left + right ) >> 1 ;
197
+ private int search (int [][] events , int x , int hi ) {
198
+ int l = 0 , r = hi ;
199
+ while (l < r ) {
200
+ int mid = (l + r ) >> 1 ;
202
201
if (events[mid][1 ] >= x) {
203
- right = mid;
202
+ r = mid;
204
203
} else {
205
- left = mid + 1 ;
204
+ l = mid + 1 ;
206
205
}
207
206
}
208
- return left ;
207
+ return l ;
209
208
}
210
209
}
211
210
```
@@ -218,15 +217,20 @@ public:
218
217
int maxValue(vector<vector<int >>& events, int k) {
219
218
sort(events.begin(), events.end());
220
219
int n = events.size();
221
- vector<vector<int >> f(n, vector<int >(k + 1));
220
+ int f[ n] [ k + 1 ] ;
221
+ memset(f, 0, sizeof(f));
222
222
function<int(int, int)> dfs = [ &] (int i, int k) -> int {
223
- if (i >= n || k <= 0) return 0;
224
- if (f[ i] [ k ] ) return f[ i] [ k ] ;
225
- vector<int > t = {events[ i] [ 1 ] };
226
- int j = upper_bound(events.begin() + i + 1, events.end(), t, [ &] (auto& l, auto& r) -> bool { return l[ 0] < r[ 0] ; }) - events.begin();
227
- int ans = max(dfs(i + 1, k), dfs(j, k - 1) + events[ i] [ 2 ] );
228
- f[ i] [ k ] = ans;
229
- return ans;
223
+ if (i >= n || k <= 0) {
224
+ return 0;
225
+ }
226
+ if (f[ i] [ k ] > 0) {
227
+ return f[ i] [ k ] ;
228
+ }
229
+ int ed = events[ i] [ 1 ] , val = events[ i] [ 2 ] ;
230
+ vector<int > t = {ed};
231
+ int p = upper_bound(events.begin() + i + 1, events.end(), t, [ ] (const auto& a, const auto& b) { return a[ 0] < b[ 0] ; }) - events.begin();
232
+ f[ i] [ k ] = max(dfs(i + 1, k), dfs(p, k - 1) + val);
233
+ return f[ i] [ k ] ;
230
234
};
231
235
return dfs(0, k);
232
236
}
@@ -237,17 +241,19 @@ public:
237
241
class Solution {
238
242
public:
239
243
int maxValue(vector<vector<int>>& events, int k) {
240
- sort(events.begin(), events.end(), [&]( auto& l, auto& r) -> bool { return l [1] < r [1]; });
244
+ sort(events.begin(), events.end(), [](const auto& a, const auto& b) { return a [1] < b [1]; });
241
245
int n = events.size();
242
- vector<vector<int>> dp(n + 1, vector<int>(k + 1));
243
- for (int i = 0; i < n; ++i) {
244
- int s = events[i][0], v = events[i][2];
245
- int h = lower_bound(events.begin(), events.begin() + i, s, [](auto& e, int x) { return e[1] < x; }) - events.begin();
246
+ int f[n + 1][k + 1];
247
+ memset(f, 0, sizeof(f));
248
+ for (int i = 1; i <= n; ++i) {
249
+ int st = events[i - 1][0], val = events[i - 1][2];
250
+ vector<int> t = {st};
251
+ int p = lower_bound(events.begin(), events.begin() + i - 1, t, [](const auto& a, const auto& b) { return a[1] < b[0]; }) - events.begin();
246
252
for (int j = 1; j <= k; ++j) {
247
- dp[i + 1 ][j] = max(dp[i ][j], dp[h ][j - 1] + v );
253
+ f[i ][j] = max(f[i - 1 ][j], f[p ][j - 1] + val );
248
254
}
249
255
}
250
- return dp [n][k];
256
+ return f [n][k];
251
257
}
252
258
};
253
259
```
@@ -290,17 +296,18 @@ func max(a, b int) int {
290
296
func maxValue (events [][]int , k int ) int {
291
297
sort.Slice (events, func (i, j int ) bool { return events[i][1 ] < events[j][1 ] })
292
298
n := len (events)
293
- dp := make ([][]int , n+1 )
294
- for i := range dp {
295
- dp [i] = make ([]int , k+1 )
299
+ f := make ([][]int , n+1 )
300
+ for i := range f {
301
+ f [i] = make ([]int , k+1 )
296
302
}
297
- for i , event := range events {
298
- h := sort.Search (i, func (k int ) bool { return events[k][1 ] >= event[0 ] })
303
+ for i := 1 ; i <= n; i++ {
304
+ st , val := events[i-1 ][0 ], events[i-1 ][2 ]
305
+ p := sort.Search (i, func (j int ) bool { return events[j][1 ] >= st })
299
306
for j := 1 ; j <= k; j++ {
300
- dp[i+ 1 ][j] = max (dp[i ][j], dp[h ][j-1 ]+event[ 2 ] )
307
+ f[i ][j] = max (f[i- 1 ][j], f[p ][j-1 ]+val )
301
308
}
302
309
}
303
- return dp [n][k]
310
+ return f [n][k]
304
311
}
305
312
306
313
func max (a , b int ) int {
@@ -311,6 +318,39 @@ func max(a, b int) int {
311
318
}
312
319
```
313
320
321
+ ### ** TypeScript**
322
+
323
+ ``` ts
324
+ function maxValue(events : number [][], k : number ): number {
325
+ events .sort ((a , b ) => a [1 ] - b [1 ]);
326
+ const n = events .length ;
327
+ const f: number [][] = new Array (n + 1 )
328
+ .fill (0 )
329
+ .map (() => new Array (k + 1 ).fill (0 ));
330
+ const search = (x : number , hi : number ): number => {
331
+ let l = 0 ;
332
+ let r = hi ;
333
+ while (l < r ) {
334
+ const mid = (l + r ) >> 1 ;
335
+ if (events [mid ][1 ] >= x ) {
336
+ r = mid ;
337
+ } else {
338
+ l = mid + 1 ;
339
+ }
340
+ }
341
+ return l ;
342
+ };
343
+ for (let i = 1 ; i <= n ; ++ i ) {
344
+ const [st, _, val] = events [i - 1 ];
345
+ const p = search (st , i - 1 );
346
+ for (let j = 1 ; j <= k ; ++ j ) {
347
+ f [i ][j ] = Math .max (f [i - 1 ][j ], f [p ][j - 1 ] + val );
348
+ }
349
+ }
350
+ return f [n ][k ];
351
+ }
352
+ ```
353
+
314
354
### ** ...**
315
355
316
356
```
0 commit comments