코딩 트레이닝

백준 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)이라는 점화식이 세워진다.