코딩고치

[백준][DP] 타일채우기 본문

백준 알고리즘 기초/다이내믹 프로그래밍

[백준][DP] 타일채우기

코딩고치 2020. 3. 30. 23:52

1. 문제 주소

https://www.acmicpc.net/problem/2133

 

2133번: 타일 채우기

문제 3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자. 입력 첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다. 출력 첫째 줄에 경우의 수를 출력한다. 예제 입력 1 복사 2 예제 출력 1 복사 3 힌트 아래 그림은 3×12 벽을 타일로 채운 예시이다....

www.acmicpc.net

2. 문제

n이 홀수인 경우에는 타일을 채울 수 없다. 따라서 짝수인 경우만 고려해주면 된다.

먼저 가장 기본적인 단위의 도형은

다음과 같이 3가지 경우이다.

하지만 n이 4가 되는 경우

위 2개의 도형도 추가적으로 생기게 된다. 이를 고려하여 코드를 작성하면 된다.

3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
using namespace std;
 
int main() {
    int n;
    cin >> n;
 
    vector<int> dp(31);
 
    dp[0= 1;
    dp[2= 3;
    for (int i = 4; i <= n; i += 2) {
        for (int j = i - 4; j >= 0; j -= 2) {
            dp[i] += dp[j] * 2;
        }
        dp[i] += dp[i - 2* 3;
    }
    cout << dp[n] << '\n';
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
Comments