#include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; int t, m, n, c, st[1001][10], dp[1001][60000]; vector<int> cd; int f(int h, int b) { if (h > n) return 0; int &ret = dp[h][b]; if (~ret) return ret; int ck[10] = {}; ret = 1e9; for (int &it : cd) { int cnt = 0, flag = 0, nxt = 0; for (int i = b, j = 0; j < m; i /= 3, j++) ck[j] = i % 3; for (int i = 0; i < m - 2; i++) if (1 << i&it) { cnt++; for (int j = i; j < i + 3; j++) ck[j] = 3; } for (int i = m; i--;) { if (st[h][i] && !ck[i]) flag = 1; if (ck[i]) ck[i]--; nxt = nxt * 3 + ck[i]; } if (!flag) ret = min(ret, cnt + f(h + 1, nxt)); } return ret; } int main() { for (scanf("%d", &t); t--;) { scanf("%d%d%d", &m, &n, &c); cd.clear(); memset(dp, -1, sizeof(dp)); memset(st, 0, sizeof(st)); for (int i = 1 << m - 2; i--;) { int flag = 0; for (int j = 1; j < m - 3; j++) if (1 << j & i && 1 << j - 1 & i) flag = 1; for (int j = 2; j < m - 3; j++) if (1 << j & i && 1 << j - 2 & i) flag = 1; if (flag) continue; cd.push_back(i); } for (int i = 0, x, y; i < c; i++) { scanf("%d%d", &x, &y); st[y][x - 1] = 1; } printf("%d\n", f(1, 0)); } return 0; }
10257번: Stains
https://www.acmicpc.net/problem/10257
피드 구독하기:
댓글
(
Atom
)
댓글 없음 :
댓글 쓰기