코딩 트레이닝
백준 11727번 - 2xn 타일링 2(C++)
Bum_2
2023. 7. 21. 01:01
문제
2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
3
예제 입력 2 복사
8
예제 출력 2 복사
171
예제 입력 3 복사
12
예제 출력 3 복사
2731
문제 풀이
#include <iostream>
using namespace std;
const int MOD = 10007;
const int MAX = 1000;
int dp[MAX + 1];
int main() {
int n;
cin >> n;
dp[1] = 1;
dp[2] = 3;
for (int i = 3; i <= n; i++) {
dp[i] = (dp[i - 1] + 2 * dp[i - 2]) % MOD;
}
cout << dp[n] << endl;
return 0;
}
동적 계획법으로 접근했다.
열이 1칸 남았을 경우 2x1로 채누는 경우 1가지( = f(n-1))
열이 2칸 남았을 경우 1x2를 위 아래로 채우는 경우 1가지 + 2x2로 채우는 경우 2가지(f(n-2) + f(n-2) = 2f(n-2))
=> f(n) = f(n-1) + 2f(n-2)이라는 점화식이 세워진다.