diff --git a/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README.md b/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README.md index 0ae985fff2bd2..6b6997b781b93 100644 --- a/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README.md +++ b/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README.md @@ -257,6 +257,47 @@ function maxValue(events: number[][], k: number): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn max_value(mut events: Vec>, k: i32) -> i32 { + events.sort_by_key(|e| e[0]); + let n = events.len(); + let mut f = vec![vec![0; (k + 1) as usize]; n]; + + fn dfs(i: usize, k: i32, events: &Vec>, f: &mut Vec>, n: usize) -> i32 { + if i >= n || k <= 0 { + return 0; + } + if f[i][k as usize] != 0 { + return f[i][k as usize]; + } + let j = search(events, events[i][1], i + 1, n); + let ans = dfs(i + 1, k, events, f, n).max(dfs(j, k - 1, events, f, n) + events[i][2]); + f[i][k as usize] = ans; + ans + } + + fn search(events: &Vec>, x: i32, lo: usize, n: usize) -> usize { + let mut l = lo; + let mut r = n; + while l < r { + let mid = (l + r) / 2; + if events[mid][0] > x { + r = mid; + } else { + l = mid + 1; + } + } + l + } + + dfs(0, k, &events, &mut f, n) + } +} +``` + @@ -409,6 +450,43 @@ function maxValue(events: number[][], k: number): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn max_value(mut events: Vec>, k: i32) -> i32 { + events.sort_by_key(|e| e[1]); + let n = events.len(); + let mut f = vec![vec![0; (k + 1) as usize]; n + 1]; + + for i in 1..=n { + let st = events[i - 1][0]; + let val = events[i - 1][2]; + let p = search(&events, st, i - 1); + for j in 1..=k as usize { + f[i][j] = f[i - 1][j].max(f[p][j - 1] + val); + } + } + + f[n][k as usize] + } +} + +fn search(events: &Vec>, x: i32, hi: usize) -> usize { + let mut l = 0; + let mut r = hi; + while l < r { + let mid = (l + r) / 2; + if events[mid][1] >= x { + r = mid; + } else { + l = mid + 1; + } + } + l +} +``` + diff --git a/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README_EN.md b/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README_EN.md index 571eacd071403..6f87bd6062aad 100644 --- a/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README_EN.md +++ b/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/README_EN.md @@ -255,6 +255,47 @@ function maxValue(events: number[][], k: number): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn max_value(mut events: Vec>, k: i32) -> i32 { + events.sort_by_key(|e| e[0]); + let n = events.len(); + let mut f = vec![vec![0; (k + 1) as usize]; n]; + + fn dfs(i: usize, k: i32, events: &Vec>, f: &mut Vec>, n: usize) -> i32 { + if i >= n || k <= 0 { + return 0; + } + if f[i][k as usize] != 0 { + return f[i][k as usize]; + } + let j = search(events, events[i][1], i + 1, n); + let ans = dfs(i + 1, k, events, f, n).max(dfs(j, k - 1, events, f, n) + events[i][2]); + f[i][k as usize] = ans; + ans + } + + fn search(events: &Vec>, x: i32, lo: usize, n: usize) -> usize { + let mut l = lo; + let mut r = n; + while l < r { + let mid = (l + r) / 2; + if events[mid][0] > x { + r = mid; + } else { + l = mid + 1; + } + } + l + } + + dfs(0, k, &events, &mut f, n) + } +} +``` + @@ -407,6 +448,43 @@ function maxValue(events: number[][], k: number): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn max_value(mut events: Vec>, k: i32) -> i32 { + events.sort_by_key(|e| e[1]); + let n = events.len(); + let mut f = vec![vec![0; (k + 1) as usize]; n + 1]; + + for i in 1..=n { + let st = events[i - 1][0]; + let val = events[i - 1][2]; + let p = search(&events, st, i - 1); + for j in 1..=k as usize { + f[i][j] = f[i - 1][j].max(f[p][j - 1] + val); + } + } + + f[n][k as usize] + } +} + +fn search(events: &Vec>, x: i32, hi: usize) -> usize { + let mut l = 0; + let mut r = hi; + while l < r { + let mid = (l + r) / 2; + if events[mid][1] >= x { + r = mid; + } else { + l = mid + 1; + } + } + l +} +``` + diff --git a/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/Solution.rs b/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/Solution.rs new file mode 100644 index 0000000000000..d5a8276d68778 --- /dev/null +++ b/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/Solution.rs @@ -0,0 +1,36 @@ +impl Solution { + pub fn max_value(mut events: Vec>, k: i32) -> i32 { + events.sort_by_key(|e| e[0]); + let n = events.len(); + let mut f = vec![vec![0; (k + 1) as usize]; n]; + + fn dfs(i: usize, k: i32, events: &Vec>, f: &mut Vec>, n: usize) -> i32 { + if i >= n || k <= 0 { + return 0; + } + if f[i][k as usize] != 0 { + return f[i][k as usize]; + } + let j = search(events, events[i][1], i + 1, n); + let ans = dfs(i + 1, k, events, f, n).max(dfs(j, k - 1, events, f, n) + events[i][2]); + f[i][k as usize] = ans; + ans + } + + fn search(events: &Vec>, x: i32, lo: usize, n: usize) -> usize { + let mut l = lo; + let mut r = n; + while l < r { + let mid = (l + r) / 2; + if events[mid][0] > x { + r = mid; + } else { + l = mid + 1; + } + } + l + } + + dfs(0, k, &events, &mut f, n) + } +} diff --git a/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/Solution2.rs b/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/Solution2.rs new file mode 100644 index 0000000000000..c908d6ad6baba --- /dev/null +++ b/solution/1700-1799/1751.Maximum Number of Events That Can Be Attended II/Solution2.rs @@ -0,0 +1,32 @@ +impl Solution { + pub fn max_value(mut events: Vec>, k: i32) -> i32 { + events.sort_by_key(|e| e[1]); + let n = events.len(); + let mut f = vec![vec![0; (k + 1) as usize]; n + 1]; + + for i in 1..=n { + let st = events[i - 1][0]; + let val = events[i - 1][2]; + let p = search(&events, st, i - 1); + for j in 1..=k as usize { + f[i][j] = f[i - 1][j].max(f[p][j - 1] + val); + } + } + + f[n][k as usize] + } +} + +fn search(events: &Vec>, x: i32, hi: usize) -> usize { + let mut l = 0; + let mut r = hi; + while l < r { + let mid = (l + r) / 2; + if events[mid][1] >= x { + r = mid; + } else { + l = mid + 1; + } + } + l +}