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



풀이



먼저 3xN 배열에서 N이 홀수일 경우는 2x1배열과  1x2배열의 조합으로는 채울 수 없다는 것을 알 수 있다.

그래서 3x2, 3x4, 3x6, 3x8 ....순서대로 배열을 채울 수 있는 경우의 수를 찾기로 한다.


3x2배열의 경우는 아래와 같이 3가지 경우의 수가 존재한다.  dp[2] = 3;


위의 모양을 조합해서 3x4의 배열을 채울 수 있는 경우는 3*3으로 9가지가 있는데 예외의 경우가 아래와 같이 2개 존재한다.

dp[4] = dp[2]*3 + 2(    그림 1)의 경우와 그림 2)의 경우   );

1)            ,       2)    



3x6의 배열은 

dp[6] = dp[4]*3 + dp[2]*2(위의 그림 1), 2)의 경우 2가지) + 2(    그림 3)의 경우와 그림 4)의 경우)

3)      ,    4)     



3x8의 배열은

dp[8] = dp[6]*3 + dp[4]*2 + dp[2]*2 + 2  이 성립하게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
int main() {
    int N;
    int dp[31= { 0 };
 
    scanf("%d"&N);
 
    dp[0= 1;
    dp[2= 3;
 
    for (int i = 4; i <= N; i+=2) {
        dp[i] = dp[i - 2* 3;
        for (int j = 4; j <= i; j += 2) {
            dp[i] += dp[i - j] * 2;
        }
    }
 
    printf("%d\n", dp[N]);
 
    return 0;
}
cs



'알고리즘' 카테고리의 다른 글

(9251)(DP) 백준 LCS  (0) 2018.08.10
(11055)(DP) 백준 가장 큰 증가 부분 수열  (0) 2018.08.07
(1699)(DP) 백준 제곱수의 합  (0) 2018.08.04
(11048)(DP) 백준 이동하기  (0) 2018.08.01
(2294)(DP) 백준 동전2  (0) 2018.08.01

+ Recent posts