From b94d1bc1e7effb36543253c670280a611cd36dd2 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Mon, 5 May 2025 20:12:55 +0800 Subject: [PATCH] 20250505 finished. --- src/problem/mod.rs | 2 + src/problem/p790_domino_and_tromino_tiling.rs | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/problem/p790_domino_and_tromino_tiling.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 020bacb..a74456e 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -634,3 +634,5 @@ mod p838_push_dominoes; mod p1007_minimum_domino_rotations_for_equal_row; mod p1128_number_of_equivalent_domino_pairs; + +mod p790_domino_and_tromino_tiling; diff --git a/src/problem/p790_domino_and_tromino_tiling.rs b/src/problem/p790_domino_and_tromino_tiling.rs new file mode 100644 index 0000000..f234cc0 --- /dev/null +++ b/src/problem/p790_domino_and_tromino_tiling.rs @@ -0,0 +1,50 @@ +/** + * [790] Domino and Tromino Tiling + */ +pub struct Solution {} + +// submission codes start here + +const MOD: i32 = 1_000_000_007; + +impl Solution { + pub fn num_tilings(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![0; n + 1]; + dp[0] = 1; + let mut prefix = 0; + + // dp的最后必须是平整的 + // dp[n] = dp[n - 1] + dp[n - 2] + for i in 0..=n-3 Sum(dp[i] * 2) + for i in 1..=n { + dp[i] = dp[i - 1] % MOD; + + if i >= 2 { + dp[i] = (dp[i] + dp[i - 2]) % MOD; + } + + if i >= 3 { + prefix = (prefix + dp[i - 3] * 2 % MOD) % MOD; + dp[i] = (dp[i] + prefix) % MOD; + } + } + + dp[n] + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_790() { + assert_eq!(1, Solution::num_tilings(1)); + assert_eq!(2, Solution::num_tilings(2)); + assert_eq!(5, Solution::num_tilings(3)); + assert_eq!(11, Solution::num_tilings(4)); + assert_eq!(312342182, Solution::num_tilings(30)); + } +}