#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxm =
10 +
5;
const int maxn =
100 +
10;
char g[maxn][maxm];
int m, n, dex;
int state[
70];
int soldier_num[
70];
int hill[maxn];
int d[maxn][
70][
70];
#define conflict(a, b) a&b
int main() {
memset(state,
0,
sizeof(state));
memset(soldier_num,
0,
sizeof(soldier_num));
memset(d,
0,
sizeof(d));
memset(hill,
0,
sizeof(hill));
scanf(
"%d%d", &n, &m);
for(
int i =
0; i < n; i++) {
scanf(
"%s", g[i]);
for(
int j =
0; j < m; j++)
if(g[i][j] ==
'H') hill[i] += (
1 << j);
}
dex =
0;
for(
int i =
0; i < (
1 << m); i++) {
if(conflict(i, i <<
1) || conflict(i, i <<
2))
continue;
int tmp = i;
while(tmp) {
soldier_num[dex] += tmp &
1;
tmp = tmp >>
1;
}
state[dex++] = i;
}
for(
int i =
0; i < dex; i++) {
if(conflict(hill[
0], state[i]))
continue;
d[
0][i][
0] = soldier_num[i];
}
for(
int i =
0; i < dex; i++) {
if(conflict(hill[
1], state[i]))
continue;
for(
int j =
0; j < dex; j++) {
if(conflict(hill[
0], state[j]))
continue;
if(conflict(state[i], state[j]))
continue;
d[
1][i][j] = max(d[
1][i][j], d[
0][j][
0] + soldier_num[i]);
}
}
for(
int r =
2; r < n; r++) {
for(
int i =
0; i < dex; i++) {
if(conflict(state[i], hill[r]))
continue;
for(
int j =
0; j < dex; j++) {
if(conflict(state[j], hill[r-
1]))
continue;
if(conflict(state[j], state[i]))
continue;
for(
int k =
0; k < dex; k++) {
if(conflict(state[k], hill[r-
2]))
continue;
if(conflict(state[k], state[i]))
continue;
if(conflict(state[k], state[j]))
continue;
d[r][i][j] = max(d[r][i][j], d[r-
1][j][k] + soldier_num[i]);
}
}
}
}
int ans =
0;
for(
int i =
0; i < dex; i++) {
for(
int j =
0; j < dex; j++) {
ans = max(ans, d[n-
1][i][j]);
}
}
printf(
"%d\n", ans);
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-1310076.html