RT,不知道为什么会WA,代码如下
#include <bits/stdc++.h>
using namespace std;
#define R register int
int f[1025][1025][5], sum[1024], a[100 + 10], Max = 0;
int inline did (int x) {
int tot = 0;
while (x) {if(x & 1) tot ++; x >>= 1;}
return tot;
}
bool inline use (int x, int y) {
if(!((x & y) || (x & a[0]) ||( y & a[1]) || (x & (x << 1)) || ((x << 2) & x) || ((y << 1) & y) || (y & (y << 2))))
return true;
return false;
}
int main () {
int n, m; scanf("%d%d", &n, &m);
for (R i = 0; i < n; i ++) {
char end = getchar();
for(R j = 0; j < m; j ++) {
char x = getchar();
a[i] <<= 1;
if(x == 'H') a[i] += 1;
}
}
for(R i = 0; i < (1 << m); i ++)
sum[i] = did(i);
for(R i = 0; i < (1 << m); i ++)
if(!(i & a[1] || (i & (i << 1)) || (i & (i << 2))))
f[0][i][0] = sum[i];
for(R i = 0; i < (1 << m); i ++)
for(R j = 0; j < (1 << m); j ++)
if(use(i, j)) f[i][j][1] = sum[i] + sum[j];
for (R i = 2; i < n; i ++)
for(R j = 0; j < (1 << m); j ++) {
if((j & a[i - 1]) || ((j << 1) & j) || (j & (j << 2))) continue;
for(R k = 0; k < (1 << m); k ++) {
if((k & a[i]) || (k & j) || (k & (k << 1)) ||( k & (k << 2))) continue;
for(R t = 1; t < (1 << m); t ++) {
if((t & j) || (t & k) || (t & a[i - 2]) || (t & (t << 1)) || (t & (t << 2))) continue;
f[j][k][i % 3] = max(f[j][k][i % 3], f[t][j][(i - 1) % 3] + sum[k]);
}
}
}
for(R i = 0; i < (1 << m); i ++)
for(R j = 0; j < (1 << m); j ++)
Max = max(Max, f[i][j][(n - 1) % 3]);
printf("%d\n", Max);
return 0;
}