diff --git a/src/main.rs b/src/main.rs index d1bb881..01ec1bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,43 +1,66 @@ -use std::cell::RefCell; +use crate::arr::make_char_matrix; +use std::collections::HashSet; mod arr; mod list; struct Solution {} impl Solution { - 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; + pub fn has_valid_path(grid: Vec>) -> bool { + if grid[0][0] == ')' + || grid[grid.len() - 1][grid[0].len() - 1] == '(' + || (grid.len() + grid[0].len()) % 2 == 0 + { + return false; } - if n == 0 || n < k { - return 0; + let mut matrix = vec![vec![Option::>::None; grid[0].len()]; grid.len()]; + matrix[0][0] = Some(HashSet::from_iter([10000])); + for i in 0..=(grid.len() - 1 + grid[0].len() - 1) { + for j in 0..=i { + if grid.len() > j && grid[0].len() > i - j { + if grid.len() > j + 1 { + let (rsrc, rdst) = matrix.split_at_mut(j + 1); + let dst = rdst[0][i - j].get_or_insert_with(HashSet::new); + let src = rsrc[j][i - j].as_ref().unwrap(); + if grid[j + 1][i - j] == '(' { + dst.extend(src.iter().map(|&x| x + 10000)); + } else { + dst.extend( + src.iter() + .filter(|&x| x / 10000 > x % 10000) + .map(|&x| x + 1), + ); + } + } + if grid[0].len() > i - j + 1 { + let (rsrc, rdst) = matrix[j].split_at_mut(i - j + 1); + let dst = rdst[0].get_or_insert_with(HashSet::new); + let src = rsrc[i - j].as_ref().unwrap(); + if grid[j][i - j + 1] == '(' { + dst.extend(src.iter().map(|&x| x + 10000)); + } else { + dst.extend( + src.iter() + .filter(|&x| x / 10000 > x % 10000) + .map(|&x| x + 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; - } - 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 + matrix[grid.len() - 1][grid[0].len() - 1].as_ref() + .unwrap() + .iter() + .any(|&x| x / 10000 == x % 10000) } } fn main() { - println!("{:?}", Solution::number_of_sets(1000, 500)); - //70047606 + println!( + "{:?}", + Solution::has_valid_path(make_char_matrix( + r#"[["(","(","("],[")","(",")"],["(","(",")"],["(","(",")"]]"# + )) + ); }