https://www.acmicpc.net/problem/15990
특정 수를 1, 2, 3의 합으로 표시할 수 있는 모든 경우의 수를 구하는 문제다. 단, 같은 수를 연속해서 사용할 수는 없다. 즉 4 = 1+2+1은 가능하지만 4 = 1+1+2는 불가능하다는 뜻이다. 때문에 그 수를 만드는 경우의 수와 마지막으로 사용한 수를 모두 저장해야한다. 사용할 수 있는 수는 1, 2, 3 개 이므로 열의 크기가 4인(인덱스를 맞추기위해) 2차원 배열을 만들어 해결한다.
dp[i][j] -> n=i일 때 마지막으로 사용한 수가 j인 경우의 수를 모두 더한 것.
따라서 점화식은 아래와 같이 나타낼 수 있다.
dp[i][1] = dp[i-1][2] + dp[i-1][3]
dp[i][2] = dp[i-2][1] + dp[i-2][3]
dp[i][3] = dp[i-3][1] + dp[i-3][2]
최종적으로 n을 만드는 경우의 수는 dp[n][1] + dp[n][2] + dp[n][3]
로 나타낼 수 있다.
import sys
# Initial
# n의 최댓값
MAX = 100000
mod = 1000000009
# Make DP table
dp = [[0 for _ in range(4)] for _ in range(MAX + 1)]
# nth -> i / 마지막에 사용한 수 j
dp[1] = [0, 1, 0, 0]
dp[2] = [0, 0, 1, 0]
dp[3] = [0, 1, 1, 1]
for i in range(4, MAX + 1):
dp[i][1] = (dp[i-1][2] + dp[i-1][3]) % mod
dp[i][2] = (dp[i-2][1] + dp[i-2][3]) % mod
dp[i][3] = (dp[i-3][1] + dp[i-3][2]) % mod
# Input n value
for _ in range(int(input())):
n = int(sys.stdin.readline())
# Answer
answer = sum(dp[n]) % mod
print(answer)