20250518 finished.
This commit is contained in:
parent
1907feaa7a
commit
69ff07860e
|
@ -660,3 +660,5 @@ mod p2900_longest_unequal_adjacent_groups_subsequence_i;
|
||||||
mod p2901_longest_unequal_adjacent_groups_subsequence_ii;
|
mod p2901_longest_unequal_adjacent_groups_subsequence_ii;
|
||||||
|
|
||||||
mod p75_sort_colors;
|
mod p75_sort_colors;
|
||||||
|
|
||||||
|
mod p1931_painting_a_grid_with_three_different_colors;
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
/**
|
||||||
|
* [1931] Painting a Grid With Three Different Colors
|
||||||
|
*/
|
||||||
|
pub struct Solution {}
|
||||||
|
|
||||||
|
// submission codes start here
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
const MOD: i32 = 1_000_000_007;
|
||||||
|
|
||||||
|
impl Solution {
|
||||||
|
pub fn color_the_grid(m: i32, n: i32) -> i32 {
|
||||||
|
let mut mask_count = 3_usize.pow(m as u32);
|
||||||
|
// 存储一行的所有合法涂色方式
|
||||||
|
// key表示mask
|
||||||
|
// value表示实际的涂色数组
|
||||||
|
let mut valid_masks = HashMap::new();
|
||||||
|
|
||||||
|
for mask in 0..mask_count {
|
||||||
|
let mut color = vec![];
|
||||||
|
let mut m_mask = mask;
|
||||||
|
|
||||||
|
for _ in 0..m {
|
||||||
|
color.push(m_mask % 3);
|
||||||
|
m_mask = m_mask / 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if color.iter().skip(1).zip(color.iter()).all(|(x, y)| x != y) {
|
||||||
|
valid_masks.insert(mask, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 预处理相邻行的合法表示
|
||||||
|
let mut adjacent_valid_masks = HashMap::new();
|
||||||
|
|
||||||
|
for (&mask1, color1) in valid_masks.iter() {
|
||||||
|
for (&mask2, color2) in valid_masks.iter() {
|
||||||
|
if color1.iter().zip(color2.iter()).all(|(x, y)| x != y) {
|
||||||
|
let entry = adjacent_valid_masks.entry(mask1).or_insert(vec![]);
|
||||||
|
entry.push(mask2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 滚动的DP数组
|
||||||
|
let mut dp = vec![0; mask_count];
|
||||||
|
|
||||||
|
// 初始化为第一行
|
||||||
|
for &mask in valid_masks.keys() {
|
||||||
|
dp[mask] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for _ in 1..n {
|
||||||
|
let mut next_dp = vec![0; mask_count];
|
||||||
|
|
||||||
|
for &next_mask in valid_masks.keys() {
|
||||||
|
for &mask in adjacent_valid_masks.get(&next_mask).unwrap() {
|
||||||
|
next_dp[next_mask] += dp[mask];
|
||||||
|
|
||||||
|
if next_dp[next_mask] >= MOD {
|
||||||
|
next_dp[next_mask] -= MOD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dp = next_dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
dp.into_iter().fold(0, |sum, i| {
|
||||||
|
if sum + i >= MOD {
|
||||||
|
sum + i - MOD
|
||||||
|
} else {
|
||||||
|
sum + i
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// submission codes end
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_1931() {
|
||||||
|
assert_eq!(3, Solution::color_the_grid(1, 1));
|
||||||
|
assert_eq!(6, Solution::color_the_grid(1, 2));
|
||||||
|
assert_eq!(580986, Solution::color_the_grid(5, 5));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user