문제
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
풀이
n=1 일 때, 1가지
n=2일 때, 2가지
n=3일 때, 3가지
n=4일 때, 5가지
n=5일 때, 8가지 ,,,
1 2 3 5 8 ... 로 방법의 수가 늘어나고
n=3일 때를
( n=2일 때 맨 오른쪽에 2x1의 블럭 1개가 들어가는 경우 ) + ( n=1일 때 오른쪽 2x2칸에 1x2블럭 2개가 들어가는 경우 )로 볼 수 있다.
n=4일 때를
( n=3일 때 맨 오른쪽에 2x1의 블럭이 들어가는 경우 ) + ( n=2일 때 오른쪽 2x2칸에 1x2블럭 2개가 들어가는 경우 )로 볼 수 있다.
n=5일 때를
( n=4일 때 맨 오른쪽에 2x1의 블럭이 들어가는 경우 ) + ( n=3일 때 오른쪽 2x2칸에 1x2블럭 2개가 들어가는 경우 )로 볼 수 있다.
...
따라서 DP[n] = DP[n-1] + DP[n-2] ( DP[1]=1, DP[2]=2)의 점화식을 찾을 수 있다.
import sys
input=sys.stdin.readline
n=int(input())
def Tiling_2xn(n):
T=[0,1,2] + [0]*(n-2)
for i in range(3, n+1): #3~n
T[i]=T[i-1]+T[i-2]
return T[n]
print(Tiling_2xn(n)%10007)