use crate::arr::make_string_arr; use std::cmp::max; struct Solution; mod arr; impl Solution { pub fn find_max_form(strs: Vec, m: i32, n: i32) -> i32 { let mut dp = vec![vec![0; m as usize + 1]; n as usize + 1]; fn get_count(str: &String) -> (i32, i32) { let (mut zeros, mut ones) = (0, 0); for c in str.chars() { if c == '0' { zeros += 1; } else { ones += 1; } } (zeros, ones) } let mut strs = strs .iter() .map(|x| get_count(x)) .collect::>(); // n1 m0 // 外1内0 for i in 0..strs.len() { let (zeros, ones) = strs[i]; for i in (ones..=n).rev() { for k in (zeros..=m).rev() { dp[i as usize][k as usize] = dp[i as usize][k as usize] .max(dp[(i - ones) as usize][(k - zeros) as usize] + 1); } } } let mut ans = 0; dp.iter() .for_each(|x| x.iter().for_each(|y| ans = max(ans, *y))); ans } } // dp? fn main() { let result = Solution::find_max_form( make_string_arr("[\"10\", \"0001\", \"111001\", \"1\", \"0\"]"), 5, 3, ); println!("{:?}", result); }