다이나믹 프로그래밍의 조건
1. problem이 sub-problem으로 쪼개질 때.
2. sub-problem으로 problem을 구할 수 있을 때.
3. sub-problem이 겹칠 때.(값을 보관해서 중복을 없앤다.)
2 × n의 모형에 대해서 생각해본다.
아래와 같은 모형으로 표현할 수 있다.
다이나믹 프로그래밍이므로 점화식으로 생각을 해야한다.
1×2, 2×1, 2x2 타일로 채우는 방법의 수를 직접 구해보고 규칙을 알아보자.
2x1: 1회 / 2x2: 3회 / 2x3: 5회 / 2x4: 11회
규칙을 보면 피보나치 형식의 냄새가 나긴하는데 뭔가가 이상하다.
2×3 = 2×2 + 2×1 을 살펴보자.
5 = 3 + 1에는 +1을 하거나, 1에 x2를 해주어야 한다.
그럼 또 2×4 = 2×3 + 2×2 를 살펴보자.
11 = 5 + 3에는 +1를 해도 11이 안나온다. 3에 x2를 해주면 11이 나오는 것을 볼 수 있다.
그렇다면 점화식은 아래와 같이 된다.
f(n) = f(n-1) + f(n-2) * 2
n = int(input())
arr = [0, 1, 3, 5]
for i in range(4, n+1):
arr.append(arr[i-1] + arr[i-2] * 2)
print(arr[n] % 10007)
arr = [0, 1, 3, 5]
for i in range(4, n+1):
arr.append(arr[i-1] + arr[i-2] * 2)