문제 설명

문제 링크

http://icpc.me/1648

 

1648번: 격자판 채우기

준규는 침대에 누워서 천장을 바라보고 있었다. 천장은 격자판 모양이었고, 계속해서 천장을 바라보다 보니 이런 생각이 들었다. 세로 크기가 N이고, 가로 크기가 M인 격자판을 2x1 크기의 도미노

www.acmicpc.net

풀이

비트 마스킹을 하며 dp를 돌면 풀 수 있다.

3 x 6 타일

위와 같은 타일이 있을 때, k 번째 타일을 놓기 위해 필요한 정보는 k + 1 번째 타일이 채워져 있는지 여부와 k + 6(m) 번째 타일이 채워져 있는지 여부이다.  이와 같이 k번째 타일을 채우기 위해서는 m개의 타일 정보만 가지고 있으면 된다. 그렇기 때문에 m개의 타일 정보를 비트 마스킹하며 채워나가면 된다.

코드

#include <cstdio>
#include <cstring>

int dp[15 * 15][1 << 14], n, m;
const int MOD = 9901;

int dpf(int k, int s) {
    if (k == n * m && !s) return 1;
    if (k >= n * m) return 0;
    int &ret = dp[k][s];
    if (~ret) return ret;
    ret = 0;
    if (s & 1) ret = dpf(k + 1, s >> 1);
    else {
        ret += dpf(k + 1, (s >> 1) | (1 << (m - 1)));
        if ((k % m) != (m - 1) && !(s & 2)) ret += dpf(k + 2, s >> 2);
    }
    return ret % MOD;
}

int main() {
    scanf("%d %d", &n, &m);
    memset(dp, -1, sizeof dp);
    printf("%d", dpf(0, 0));
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[9663] N-Queen  (0) 2021.09.25
백준[1657] 두부장수 장홍준  (0) 2021.09.10
백준[17413] 단어 뒤집기 2  (0) 2021.09.06
백준 [2494] 숫자 맞추기  (0) 2021.09.05
백준[13392] 방법을 출력하지 않는 숫자 맞추기  (0) 2021.09.03
복사했습니다!