From 04acafa3ac30f2bf8509d63ddf935e9546dd78a5 Mon Sep 17 00:00:00 2001 From: li-chx Date: Thu, 17 Sep 2026 10:28:03 +0800 Subject: [PATCH] =?UTF-8?q?1621.=20=E5=A4=A7=E5=B0=8F=E4=B8=BA=20K=20?= =?UTF-8?q?=E7=9A=84=E4=B8=8D=E9=87=8D=E5=8F=A0=E7=BA=BF=E6=AE=B5=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 77 +++++++++++++++++++---------------------------------- 1 file changed, 27 insertions(+), 50 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1168c53..d1bb881 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,66 +1,43 @@ -use crate::arr::make_matrix; +use std::cell::RefCell; mod arr; mod list; struct Solution {} impl Solution { - pub fn max_palindromes(s: String, k: i32) -> i32 { - let k = k as usize; - let mut mat = vec![vec![false; s.len()]; s.len() + 1]; - let s = s.as_bytes(); - 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]; + pub fn number_of_sets(n: i32, k: i32) -> i32 { + let mut mem = vec![vec![vec![-1; n as usize]; n as usize]; 2]; + let rc = RefCell::new(&mut mem); + Self::dfs(&rc, n as usize - 1, k as usize, false) as i32 + } + pub fn dfs(rc: &RefCell<&mut Vec>>>, n: usize, k: usize, is_empty: bool) -> i64 { + if k == 0 || n == k { + return 1; } - for i in 2..s.len() { - if i % 2 == 0 { - if af1 { - continue; - } - } else if af2 { - continue; - } - let mut local = false; - for j in 0..s.len() - i { - mat[i][j] = mat[i - 2][j + 1] && s[j] == s[j + i]; - local |= mat[i][j]; - } - if i%2 == 0 { - af1 = !local; - }else { - af2 = !local; - } + if n == 0 || n < k { + return 0; } - // 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)); - } - } + let matrix_idx = if is_empty { 1 } else { 0 }; + if rc.borrow()[matrix_idx][n][k] != -1 { + return rc.borrow()[matrix_idx][n][k] as i64; } - 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 } } fn main() { - println!( - "{:?}", - Solution::max_palindromes("abaccdbbd".to_string(), 3) - ); + println!("{:?}", Solution::number_of_sets(1000, 500)); + //70047606 }