1621. 大小为 K 的不重叠线段的数目
This commit is contained in:
+26
-49
@@ -1,66 +1,43 @@
|
|||||||
use crate::arr::make_matrix;
|
use std::cell::RefCell;
|
||||||
|
|
||||||
mod arr;
|
mod arr;
|
||||||
mod list;
|
mod list;
|
||||||
|
|
||||||
struct Solution {}
|
struct Solution {}
|
||||||
impl Solution {
|
impl Solution {
|
||||||
pub fn max_palindromes(s: String, k: i32) -> i32 {
|
pub fn number_of_sets(n: i32, k: i32) -> i32 {
|
||||||
let k = k as usize;
|
let mut mem = vec![vec![vec![-1; n as usize]; n as usize]; 2];
|
||||||
let mut mat = vec![vec![false; s.len()]; s.len() + 1];
|
let rc = RefCell::new(&mut mem);
|
||||||
let s = s.as_bytes();
|
Self::dfs(&rc, n as usize - 1, k as usize, false) as i32
|
||||||
let (mut af1, mut af2) = (false, true);
|
|
||||||
for i in 0..s.len() {
|
|
||||||
mat[0][i] = true;
|
|
||||||
mat[1][i] = i + 1 < s.len() && s[i] == s[i + 1];
|
|
||||||
af2 &= mat[1][i];
|
|
||||||
}
|
}
|
||||||
for i in 2..s.len() {
|
pub fn dfs(rc: &RefCell<&mut Vec<Vec<Vec<i32>>>>, n: usize, k: usize, is_empty: bool) -> i64 {
|
||||||
if i % 2 == 0 {
|
if k == 0 || n == k {
|
||||||
if af1 {
|
return 1;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
} else if af2 {
|
if n == 0 || n < k {
|
||||||
continue;
|
return 0;
|
||||||
}
|
}
|
||||||
let mut local = false;
|
let matrix_idx = if is_empty { 1 } else { 0 };
|
||||||
for j in 0..s.len() - i {
|
if rc.borrow()[matrix_idx][n][k] != -1 {
|
||||||
mat[i][j] = mat[i - 2][j + 1] && s[j] == s[j + i];
|
return rc.borrow()[matrix_idx][n][k] as i64;
|
||||||
local |= mat[i][j];
|
|
||||||
}
|
|
||||||
if i%2 == 0 {
|
|
||||||
af1 = !local;
|
|
||||||
}else {
|
|
||||||
af2 = !local;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for i in 0..s.len() {
|
|
||||||
// println!("{:?} ", mat[i]);
|
|
||||||
// }
|
|
||||||
let mut events = Vec::new();
|
|
||||||
for i in k - 1 .. s.len() {
|
|
||||||
for j in 0..s.len() - i {
|
|
||||||
if mat[i][j] {
|
|
||||||
events.push((j, j + i + 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
events.sort_unstable_by(|a,b| a.1.cmp(&b.1));
|
|
||||||
// println!("{:?}", events);
|
|
||||||
let (mut certain,mut ans) = (0,0);
|
|
||||||
for (a,b) in events {
|
|
||||||
if a >= certain {
|
|
||||||
certain = b;
|
|
||||||
ans += 1;
|
|
||||||
}
|
}
|
||||||
|
let r#mod = 1e9 as i64 + 7;
|
||||||
|
let mut ans = 0;
|
||||||
|
if !is_empty {
|
||||||
|
ans += Self::dfs(rc, n - 1, k, false) + Self::dfs(rc, n - 1, k, true)
|
||||||
|
- Self::dfs(rc, n - 2, k, true)
|
||||||
|
- Self::dfs(rc, n - 2, k - 1, false);
|
||||||
|
ans = (ans + r#mod) % r#mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ans += Self::dfs(rc, n - 1, k, true) + Self::dfs(rc, n - 1, k - 1, false);
|
||||||
|
ans = ans % r#mod;
|
||||||
|
rc.borrow_mut()[matrix_idx][n][k] = ans as i32;
|
||||||
ans
|
ans
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!(
|
println!("{:?}", Solution::number_of_sets(1000, 500));
|
||||||
"{:?}",
|
//70047606
|
||||||
Solution::max_palindromes("abaccdbbd".to_string(), 3)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user