Skip to content

Commit c17447c

Browse files
committed
feat: add solutions to lc problem: No.1751
No.1751.Maximum Number of Events That Can Be Attended II
1 parent ef72f5b commit c17447c

File tree

7 files changed

+254
-143
lines changed

7 files changed

+254
-143
lines changed

solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README.md

+97-57
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ $$
7979

8080
我们可以将方法一中的记忆化搜索改为动态规划。
8181

82-
先将会议排序,这次我们按照结束时间从小到大排序。然后定义 $dp[i][j]$ 表示前 $i$ 个会议中,最多参加 $j$ 个会议的最大价值和。答案即为 $dp[n][k]$。
82+
先将会议排序,这次我们按照结束时间从小到大排序。然后定义 $f[i][j]$ 表示前 $i$ 个会议中,最多参加 $j$ 个会议的最大价值和。答案即为 $f[n][k]$。
8383

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]$。取二者的较大值即可。即:
8585

8686
$$
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])
8888
$$
8989

9090
其中 $h$ 为最后一个结束时间小于第 $i$ 个会议开始时间的会议,可以通过二分查找得到。
@@ -106,16 +106,16 @@ $$
106106
class Solution:
107107
def maxValue(self, events: List[List[int]], k: int) -> int:
108108
@cache
109-
def dfs(i, k):
109+
def dfs(i: int, k: int) -> int:
110110
if i >= len(events):
111111
return 0
112-
_, e, v = events[i]
112+
_, ed, val = events[i]
113113
ans = dfs(i + 1, k)
114114
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)
117117
return ans
118-
118+
119119
events.sort()
120120
return dfs(0, k)
121121
```
@@ -125,12 +125,12 @@ class Solution:
125125
def maxValue(self, events: List[List[int]], k: int) -> int:
126126
events.sort(key=lambda x: x[1])
127127
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])
131131
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]
134134
```
135135

136136
### **Java**
@@ -160,21 +160,20 @@ class Solution {
160160
}
161161
int j = search(events, events[i][1], i + 1);
162162
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;
165164
}
166165

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;
171170
if (events[mid][0] > x) {
172-
right = mid;
171+
r = mid;
173172
} else {
174-
left = mid + 1;
173+
l = mid + 1;
175174
}
176175
}
177-
return left;
176+
return l;
178177
}
179178
}
180179
```
@@ -184,28 +183,28 @@ class Solution {
184183
public int maxValue(int[][] events, int k) {
185184
Arrays.sort(events, (a, b) -> a[1] - b[1]);
186185
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);
191190
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);
193192
}
194193
}
195-
return dp[n][k];
194+
return f[n][k];
196195
}
197196

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;
202201
if (events[mid][1] >= x) {
203-
right = mid;
202+
r = mid;
204203
} else {
205-
left = mid + 1;
204+
l = mid + 1;
206205
}
207206
}
208-
return left;
207+
return l;
209208
}
210209
}
211210
```
@@ -218,15 +217,20 @@ public:
218217
int maxValue(vector<vector<int>>& events, int k) {
219218
sort(events.begin(), events.end());
220219
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));
222222
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];
230234
};
231235
return dfs(0, k);
232236
}
@@ -237,17 +241,19 @@ public:
237241
class Solution {
238242
public:
239243
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]; });
241245
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();
246252
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);
248254
}
249255
}
250-
return dp[n][k];
256+
return f[n][k];
251257
}
252258
};
253259
```
@@ -290,17 +296,18 @@ func max(a, b int) int {
290296
func maxValue(events [][]int, k int) int {
291297
sort.Slice(events, func(i, j int) bool { return events[i][1] < events[j][1] })
292298
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)
296302
}
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 })
299306
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)
301308
}
302309
}
303-
return dp[n][k]
310+
return f[n][k]
304311
}
305312

306313
func max(a, b int) int {
@@ -311,6 +318,39 @@ func max(a, b int) int {
311318
}
312319
```
313320

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+
314354
### **...**
315355

316356
```

0 commit comments

Comments
 (0)