Codeforces 342D Xenia and Dominoes 状压dp

时间:2023-03-08 17:51:17

码就完事了。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); template<class T>
void add(T &a, T b) {
a += b; if(a >= mod) a -= mod;
} int n, tx, ty;
int dp[N][ << ][];
int state[N];
char Map[][N]; bool can(int x, int y, int op) {
if(op == ) return Map[x][y] == '.' && Map[x][y + ] == '.';
else return Map[x][y] == '.' && Map[x + ][y] == '.';
} bool ok(int x, int y, int op) {
if(op == ) {
if(x != tx) return false;
return y + == ty || y - == ty;
} else {
if(y != ty) return false;
return x + == tx || x - == tx;
}
} int main() {
scanf("%d", &n);
for(int i = ; i < ; i++) scanf("%s", Map[i] + );
for(int i = ; i < ; i++) {
for(int j = ; j <= n; j++) {
if(Map[i][j] == 'O') {
tx = i;
ty = j;
i = ;
break;
}
}
}
for(int j = ; j <= n; j++) {
for(int i = ; i < ; i++)
if(Map[i][j] != '.') state[j] |= << i;
}
dp[][state[]][] = ;
for(int j = ; j <= n; j++) {
for(int mask = ; mask < ( << ); mask++) {
for(int k = ; k < ; k++) {
if(mask == ) {
if(can(, j, ) && can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, ) || ok(, j, )], dp[j][mask][k]);
if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]);
if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]); } else if(mask == ) {
if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]);
if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) {
if(can(, j, ) && can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, ) || ok(, j, )], dp[j][mask][k]);
if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { if(can(, j, ))
add(dp[j + ][ | state[j + ]][k || ok(, j, )], dp[j][mask][k]); } else if(mask == ) { add(dp[j + ][ | state[j + ]][k], dp[j][mask][k]); }
}
}
}
printf("%d\n", dp[n + ][][]);
return ;
} /*
*/