1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
def sol(n, now, before):
global MOD_NUM
if n == 0:
// 처음에 시작 높이 1
if now == 0:
dp[n][now][before] = 1
else:
dp[n][now][before] = 0
return dp[n][now][before]
if dp[n][now][before] == -1:
a1, a2, a3 = 0, 0, 0
// 높이가 0일 경우 다음꺼 상관x
if now == 0:
a1 = sol(n - 1, 0, now)% MOD_NUM
a2 = sol(n - 1, 1, now)% MOD_NUM
a3 = sol(n - 1, 2, now)% MOD_NUM
elif now == 1: //현재 1
if before == 0: // 이전 높이가 0이면 아무거나 올 수 있다.
a1 = sol(n - 1, 0, now)% MOD_NUM
a2 = sol(n - 1, 1, now)% MOD_NUM
a3 = sol(n - 1, 2, now)% MOD_NUM
else: // 아니면 다음 높이는 무조건 0
a1 = sol(n - 1, 0, now)% MOD_NUM
else: // 2일 때
if before == 0: // 2가 연속으로 올 수 없음
a1 = sol(n - 1, 0, now)% MOD_NUM
a2 = sol(n - 1, 1, now)% MOD_NUM
else:
a1 = sol(n - 1, 0, now)% MOD_NUM
dp[n][now][before] = (a1 + a2 + a3) % MOD_NUM
return dp[n][now][before]
def exp(n, now, before):
global MOD_NUM
if n == 0:
if now == 0:
ex[n][now][before] = 1
else:
ex[n][now][before] = 0
return ex[n][now][before]
if ex[n][now][before] == -1:
a1, a2 = 0, 0
if now == 0:
a1 = exp(n - 1, 0, now)% MOD_NUM
a2 = exp(n - 1, 1, now)% MOD_NUM
else:
if before == 0:
a1 = exp(n - 1, 0, now)% MOD_NUM
a2 = exp(n - 1, 1, now)% MOD_NUM
else:
a1 = exp(n - 1, 0, now)% MOD_NUM
ex[n][now][before] = (a1 + a2) % MOD_NUM
return ex[n][now][before]
import sys
sys.setrecursionlimit(2000)
MOD_NUM = 1000000007
N = int(input())
dp = [[[-1 for i in range(3)] for i in range(3)] for i in range(N)]
ex = [[[-1 for i in range(2)] for i in range(2)] for i in range(N)]
alls = sol(N - 1, 0, 0) + sol(N - 1, 1, 0) + sol(N - 1, 2, 0)
exception = exp(N - 1, 0, 0) + exp(N - 1, 1, 0)
print((alls - exception) % MOD_NUM)
|