알고리즘/백준
[백준/BOJ/1648] 격자 채우기
코딩하는 회사원
2024. 5. 12. 21:09
728x90
#include <iostream>
#include <cstring>
using namespace std;
const int MOD = 9901;
int N, M, dp[15*15][1 << 14 + 1];
int dfs(int num, int status) {
if (num == N * M && status == 0) return 1;
if (num >= N * M) return 0;
int &ret = dp[num][status];
if (ret != -1) return ret;
ret = 0;
if (status & 1) {
ret = dfs(num + 1, status >> 1);
}
else {
// 세로 채우기
ret = dfs(num + 1, (status >> 1) | (1 << (M - 1)));
// 가장 오른쪽 검사, 오른쪽칸 비어있는지 유무 확인
if ((num % M) != (M-1) && (status & 2) == 0) {
// 가로 채우기
ret += dfs(num + 2, (status >> 2));
}
}
return ret %= MOD;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
memset(dp, -1, sizeof(dp));
cout << dfs(0, 0) << "\n";
return 0;
}
728x90