Number of Distinct Roll Sequences LeetCode solution in Rust

1
const DICE_LEN: usize = 7;
2
const MOD: usize = 1_000_000_007;
3

4
pub fn gen_next_map() -> [u8; DICE_LEN] {
5
[
6
0b1111110, // 0 -> [1, 2, 3, 4, 5, 6]
7
0b1111100, // 1 -> [2, 3, 4, 5, 6]
8
0b0101010, // 2 -> [1, 3, 5]
9
0b0110110, // 3 -> [1, 2, 4, 5]
10
0b0101010, // 4 -> [1, 3, 5]
11
0b1011110, // 5 -> [1, 2, 3, 4, 6]
12
0b0100010, // 6 -> [1, 5]
13
]
14
}
15

16
impl Solution {
17
pub fn distinct_sequences(n: i32) -> i32 {
18
let n = n as usize - 1;
19

20
let next_map = gen_next_map();
21

22
let mut dp = [[usize::MIN; DICE_LEN]; DICE_LEN];
23
for j in 1..DICE_LEN {
24
dp[usize::MIN][j] = 1;
25
}
26

27
for _ in 0..n {
28
let mut dp_next = [[usize::MIN; DICE_LEN]; DICE_LEN];
29

30
for prev in 0..DICE_LEN {
31
for i in 0..DICE_LEN {
32
let flags = next_map[i] & !(1 << prev);
33

34
for j in 0..DICE_LEN {
35
if (flags >> j) & 1 < 1 {
36
continue;
37
}
38

39
dp_next[i][j] += dp[prev][i];
40
}
41
}
42
}
43

44
for i in 0..DICE_LEN {
45
for j in 0..DICE_LEN {
46
dp_next[i][j] %= MOD;
47
}
48
}
49
dp = dp_next;
50
}
51

52
let ret = dp
53
.into_iter()
54
.map(|v| v.into_iter().sum::<usize>() % MOD)
55
.sum::<usize>()
56
% MOD;
57
ret as i32
58
}
59
}

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0