Jerry_heng @ 2023-11-17 22:53:43
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,dp[3][1024][1024],s[2010];
void getsum(int x){
int y=x;
while(x){
s[y]+=x&1;
x>>=1;
}
}
int a[110];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
char ch;
cin>>ch;
a[i]+=(ch=='H')*(1<<(j-1));
}
for(int i=0;i<(1<<m);i++)getsum(i);
for(int i=0;i<(1<<m);i++){
bool pd=0;
if(a[1]&i)continue;
for(int j=1;j<=m;j++){
if(!((i>>(j-1))&1))continue;
pd|=(i>>(j-2))&1;
pd|=(i>>(j-3))&1;
}
if(!pd)dp[0][0][i]=s[i];
}
for(int i=0;i<(1<<m);i++)
for(int k=0;k<(1<<m);k++){
bool pd=0;
if(a[2]&i)continue;
for(int j=1;j<=m;j++){
if(!((i>>(j-1))&1))continue;
pd|=(k>>(j-1))&1;
pd|=(i>>(j-2))&1;
pd|=(i>>(j-3))&1;
}
if(!pd)dp[1][k][i]=dp[0][0][k]+s[i];
}
for(int i=3;i<=n;i++)
for(int j=0;j<(1<<m);j++){
if(a[i]&j)continue;
bool pd=0;
for(int k=1;k<=m;k++){
if(!((j>>(k-1))&1))continue;
pd|=(j>>(k-2))&1;
pd|=(j>>(k-3))&1;
if(pd)break;
}
if(pd)continue;
for(int l1=0;l1<(1<<m);l1++)
for(int l2=0;l2<(1<<m);l2++){
pd=0;
for(int k=1;k<=m;k++){
if(!((j>>(k-1))&1))continue;
pd|=(l1>>(k-1))&1;
pd|=(l2>>(k-1))&1;
if(pd)break;
}
if(!pd)dp[(i-1)%3][l2][j]=max(dp[(i-1)%3][l2][j],s[j]+dp[(i-2)%3][l1][l2]);
}
}
for(int i=0;i<(1<<m);i++)
for(int j=0;j<(1<<m);j++)
ans=max(ans,dp[(n-1)%3][i][j]);
cout<<ans;
return 0;
}