lc_lca @ 2019-03-28 23:20:28
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
bool in_s[1<<11];
int c[1<<11];
bool valid[110][1<<11];
int dp[110][1<<11][1<<11];
int n,m;
char a[110][110];
int main()
{
memset(in_s,false,sizeof(in_s));
memset(valid,false,sizeof(valid));
memset(dp,0,sizeof(dp));
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
}
for(int i=0;i<1<<m;i++)
{
int cnt_1=0;
for(int j=0;j<m;j++)
{
if((i>>j)&1)
{
cnt_1++;
}
}
c[i]=cnt_1;
}
for(int i=0;i<1<<m;i++)
{
int tmp=0;
int cnt=0;
bool ok=true;
for(int j=0;j<m;j++)
{
if((i>>j)&1)
{
if(!tmp)
{
tmp=1;
}
else
{
if(cnt<2)
{
ok=false;
}
}
cnt=0;
}
else
{
cnt++;
}
}
in_s[i]=ok;
}
for(int i=0;i<1<<m && in_s[i];i++)
{
for(int j=0;j<n;j++)
{
bool ok=true;
for(int k=0;k<m;k++)
{
if((i>>k)&1 && a[j][m-1-k]=='H')
{
ok=false;
}
}
valid[j][i]=ok;
}
}
dp[0][0][0]=0;
for(int i=2;i<n;i++)
{
for(int j=0;j<1<<m && in_s[j];j++)
{
for(int k=0;k<1<<m && in_s[k];k++)
{
if(valid[i][j] && valid[i-1][k] && (j&k)==0)
{
for(int l=0;l<1<<m && in_s[l];l++)
{
if((j&l)==0)
{
dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]);
}
}
dp[i][j][k]+=c[j];
}
else
{
dp[i][j][k]=-inf;
}
}
}
}
int ans=-inf;
for(int i=0;i<1<<m && in_s[i];i++)
{
for(int j=0;j<1<<m && in_s[j];j++)
{
if((i&j)==0 && valid[n-1][i] && valid[n-2][j])
{
ans=max(ans,dp[n-1][i][j]);
}
}
}
cout<<ans<<endl;
return 0;
}