3129. 找出所有稳定的二进制数组 I

This commit is contained in:
li_chx 2026-03-10 09:51:11 +08:00
parent c18ad8c1b0
commit bd8207767a
Signed by: li_chx
GPG Key ID: 70D4985BB8180E92
1 changed files with 29 additions and 48 deletions

View File

@ -1,62 +1,43 @@
use std::cmp::min;
struct Solution; struct Solution;
mod arr; mod arr;
impl Solution { impl Solution {
pub fn min_flips(s: String) -> i32 { pub fn number_of_stable_arrays(zero: i32, one: i32, limit: i32) -> i32 {
let mut len = s.len(); let md = 1e9 as i64 + 7;
let (mut even_zero, mut even_one, mut odd_zero, mut odd_one) = (0, 0, 0, 0); let mut dp = vec![vec![vec![0; 2]; one as usize + 1]; zero as usize + 1];
//let s = (s.clone() + &s).chars().collect::<Vec<_>>(); for i in 1..=limit as usize {
let mut ans = 1e6 as i32; if i <= one as usize {
let mut is_even = true; dp[0][i][1] = 1;
}
for c in s.chars() { if i <= zero as usize {
if is_even { dp[i][0][0] = 1;
is_even = false;
if c == '0' {
even_zero += 1;
} else {
even_one += 1;
}
} else {
is_even = true;
if c == '0' {
odd_zero += 1;
} else {
odd_one += 1;
}
} }
} }
for c in s.chars() { for i in 1..=zero as usize {
ans = min(ans, min(odd_zero + even_one, odd_one + even_zero)); for j in 1..=one as usize {
if len & 1 == 1 { dp[i][j][0] = (((dp[i - 1][j][0] + dp[i - 1][j][1]
if c == '0' { - if i as i32 - limit - 1 >= 0 {
odd_zero += 1; dp[i - limit as usize - 1][j][1]
} else { } else {
odd_one += 1; 0
} }) as i64
} else { + md)
if c == '0' { % md) as i32;
even_zero += 1; dp[i][j][1] = (((dp[i][j - 1][0] + dp[i][j - 1][1]
- if j as i32 - limit - 1 >= 0 {
dp[i][j - limit as usize - 1][0]
} else { } else {
even_one += 1; 0
} }) as i64
} + md)
(even_zero, even_one, odd_zero, odd_one) = (odd_zero, odd_one, even_zero, even_one); % md) as i32;
if c == '0' {
odd_zero -= 1;
} else {
odd_one -= 1;
} }
} }
ans ((dp[zero as usize][one as usize][0] as i64 + dp[zero as usize][one as usize][1] as i64) % md) as i32
} }
} }
// 111000 o0 1 o1 2 j0 2 j1 1
// 1110001 o0 1 o1 3 j0 2 j1 1
// 1110001 o0 2 o1 1 j0 1 j1 3
// 110001 2 1 1 2
fn main() { fn main() {
let result = Solution::min_flips("111000".to_string()); let result = Solution::number_of_stable_arrays(39, 20, 18);
// let result = Solution::number_of_stable_arrays(200, 200, 25);
println!("{:?}", result); println!("{:?}", result);
} }