Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
神奇阿……这么水的代码尽然657MS……#include <stdio.h> #include <string.h> #define MAX 59049 short a[2][MAX]; bool CouldH[155][11], CouldV[155][11]; int n, m, nBad; int power[11]; void Init() { int i; power[0] = 1; for(i=1; i<=10; i++){ power[i] = power[i-1]*3; } } void InitCase() { memset(a, 0, sizeof(a)); memset(CouldH, true, sizeof(CouldH)); memset(CouldV, true, sizeof(CouldV)); scanf("%d%d%d", &n, &m, &nBad); int i, j, x, y; while(nBad --){ scanf("%d%d", &x, &y); for(i=-2; i<=0; i++) for(j=-1; j<=0; j++){ if(x+i >= 0 && y+j > 0) CouldH[x+i][y+j-1] = false; if(x+j >= 0 && y+i > 0) CouldV[x+j][y+i-1] = false; } } for(i=0; i<=n; i++){ CouldH[i][m-1] = false; CouldV[i][m-1]=CouldV[i][m-2] = false; } for(i=0; i<m; i++){ CouldH[n][i] = CouldH[n-1][i] = false; CouldV[n][i] = false; } } int Code(int a[11]){ int ret = 0, i; for(i=0; i<m; i++) ret += a[i]*power[i]; return ret; } int CodeMinus(int a[11]){ int ret = 0, i; for(i=0; i<m; i++) if(a[i] > 0) ret += (a[i]-1)*power[i]; return ret; } void Decode(int k, int status[11]) { for(int i=0; i<m; i++){ status[i] = k%3; k = k/3; } } void dfs(int i, int j, int status[11], int cnt) { if(j >= m){ int code = CodeMinus(status); if(a[i%2][code] < cnt) a[i%2][code] = cnt; return ; } if(CouldH[i][j] && status[j] == 0 && status[j+1] == 0){ status[j] = status[j+1] = 3; dfs(i, j+2, status, cnt+1); status[j] = status[j+1] = 0; } if(CouldV[i][j] && status[j] == 0 && status[j+1] == 0 && status[j+2] == 0){ status[j] = status[j+1] = status[j+2] = 2; dfs(i, j+3, status, cnt+1); status[j] = status[j+1] = status[j+2] = 0; } dfs(i, j+1, status, cnt); } void Solve() { int now, i, j, status[11]; memset(a[0], 0xff, sizeof(a[1])); a[0][0] = 0; for(i=1; i<=n; i++){ now = i%2; memset(a[now], 0xff, sizeof(a[now])); for(j=0; j< power[m]; j++){ if(a[1-now][j] < 0) continue; Decode(j, status); dfs(i, 0, status, a[1-now][j]); } } int ans = 0; for(i=0; i < power[m]; i++){ if(ans < a[n%2][i]) ans = a[n%2][i]; } printf("%d\n", ans); } int main() { int nCase; scanf("%d", &nCase); Init(); while(nCase--){ InitCase(); Solve(); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator