[BOJ]2133 타일 채우기 <다시풀기>

dp 예제

Posted by kyoungIn on March 26, 2019

타일 채우기 <다시풀기>

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 14819 5202 4060 35.645%

문제

3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.

입력

첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다.

출력

첫째 줄에 경우의 수를 출력한다.

예제 입력 1

1
2

예제 출력 1

1
3

힌트

아래 그림은 3×12 벽을 타일로 채운 예시이다.

img

풀이

길이가 2인 타일은 총 3개있다.

이게 끝이 아니라

길이가 4인 타일도 2개 있다.

길이가 6인 타일도 2개있다..

즉,

점화식은

dp[n]=dp[n-2]x3 + dp[n-4]x2+ dp[n-6]x2 …..dp[0]x2 라는것 !!

어렵다,, ㅜㅜㅜㅜㅜ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

using namespace std;

int main(){
    int dp[31]={0};
    int n; cin >> n;
    dp[0]=1;dp[1]=0;dp[2]=3;
    for(int i=3;i<=n;i++){
        dp[i]+=3*dp[i-2];
        for(int j=i-4;j>=0;j-=2){
            dp[i]+=2*dp[j];
        }
    }
    cout <<dp[n];
}