File tree Expand file tree Collapse file tree 1 file changed +68
-0
lines changed Expand file tree Collapse file tree 1 file changed +68
-0
lines changed Original file line number Diff line number Diff line change
1
+ // DP
2
+ class Solution {
3
+ fun countVowelPermutation (n : Int ): Int {
4
+ val mod = 1_000_000_000 + 7
5
+ val dp = Array (n + 1 ) { LongArray (5 ) }
6
+
7
+ for (j in 0 until 5 )
8
+ dp[1 ][j] = 1
9
+
10
+ val a = 0
11
+ val e = 1
12
+ val i = 2
13
+ val o = 3
14
+ val u = 4
15
+
16
+ for (j in 2 .. n) {
17
+ dp[j][a] = 0L + (dp[j - 1 ][e] + dp[j - 1 ][i] + dp[j - 1 ][u]) % mod
18
+ dp[j][e] = 0L + (dp[j - 1 ][a] + dp[j - 1 ][i]) % mod
19
+ dp[j][i] = 0L + (dp[j - 1 ][e] + dp[j - 1 ][o]) % mod
20
+ dp[j][o] = 0L + (dp[j - 1 ][i]) % mod
21
+ dp[j][u] = 0L + (dp[j - 1 ][i] + dp[j - 1 ][o]) % mod
22
+ }
23
+
24
+ return (dp[n].sum()!! % mod).toInt()
25
+ }
26
+ }
27
+
28
+ // recursion + memoization
29
+ class Solution {
30
+ fun countVowelPermutation (n : Int ): Int {
31
+ val mod = 1_000_000_000 + 7
32
+ val dp = Array (n) { IntArray (5 ) { - 1 } }
33
+
34
+ val a = 0
35
+ val e = 1
36
+ val i = 2
37
+ val o = 3
38
+ val u = 4
39
+
40
+ val follow = mapOf (
41
+ a to listOf (e),
42
+ e to listOf (a, i),
43
+ i to listOf (a, e, o, u),
44
+ o to listOf (i, u),
45
+ u to listOf (a)
46
+ )
47
+
48
+ fun dfs (idx : Int , prev : Int ): Int {
49
+ if (idx == n) return 1
50
+ if (dp[idx][prev] != - 1 ) return dp[idx][prev]
51
+
52
+ var res = 0
53
+ follow[prev]?.forEach {
54
+ res = (res + dfs(idx + 1 , it)) % mod
55
+ }
56
+
57
+ dp[idx][prev] = res
58
+ return res
59
+ }
60
+
61
+ var res = 0
62
+ follow.keys.forEach {
63
+ res = (res + dfs(1 , it)) % mod
64
+ }
65
+
66
+ return res
67
+ }
68
+ }
You can’t perform that action at this time.
0 commit comments