WA on#1#2#5#8#9#10#11#12
RE on#3#4#6#7
求调
#include<bits/stdc++.h>
using namespace std;
int cnt[105],p[105],mp[105];
int dp[105][105][105];
int main(){
int n,m,b = 0;
cin >> n >> m;
string s;
for(int i = 0;i < n;i++){
cin >> s;
for(int j = 0;j < m;j++){
if(s[j] == 'H')mp[i]++;
mp[i] <<= 1;
}
}
for(int i = 0;i < (1<<n);i++){
int t = 0,i1 = i;
while(i1){
if(i1&1) t++;
i1 >>= 1;
}
cnt[i] = t;
if(((i<<1)&i) == 0 && ((i<<2)&i) == 0 && ((i>>1)&i) == 0 && ((i>>2)&i) == 0) p[++b] = i;
if((i&mp[0]) == 0) dp[0][i][0] = cnt[i];
}
for(int i = 1;i <= b;i++){
for(int j = 1;j <= b;j++){
if(((p[i]&p[j])|(p[j]&mp[1])) == 0){
dp[1][j][i] = max(dp[1][j][i],dp[0][i][0]+cnt[j]);
}
}
}
for(int i = 2;i < n;i++){
for(int j = 1;j <= b;j++){
if((p[j]&mp[i]) == 0){
for(int k = 1;k <= b;k++){
if((p[k]&p[j]) == 0&&(p[k]&mp[i-1]) == 0){
for(int l = 1;l <= b;l++){
if((p[l]&p[k]) == 0 && (p[l]&p[j]) == 0 && (p[l]&mp[i-2]) == 0){
dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][l]+cnt[j]);
}
}
}
}
}
}
}
int ans = 0;
for(int i = 1;i <= b;i++){
for(int j = 1;j <= b;j++){
ans = max(dp[n-1][i][j],ans);
}
}
cout << ans;
return 0;
}