ioio0614 @ 2018-09-14 09:36:25
#include<bits/stdc++.h>
using namespace std;
int dp[55][1<<10][1<<10];
int s[1<<10],g[1<<10],top;
int mp[1<<10];
int get(int n)
{
int ans=0;
while(n)
{
if(n%2) ans++;
n/=2;
}
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
top=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char c;
cin>>c;
if(c=='H') mp[i]+=1<<j;
}
}
for(int i=0;i<(1<<m);i++)
{
if(((i&(i<<1))==0)&&((i&(i<<2))==0)&&((i&(i>>1))==0)&&((i&(i>>2))==0))
{
s[top]=i;
g[top]=get(i);
if((mp[1]&i)==0)dp[1][0][top]=g[top];
top++;
}
}
///for(int i=0;i<top;i++) cout<<s[i]<<" "<<g[i]<<endl;
for(int i=0;i<top;i++)
{
for(int j=0;j<top;j++)
{
if(((s[j]&mp[2])==0)&&((s[i]&s[j])==0))
{
dp[2][i][j]=max(dp[2][i][j],dp[1][0][i]+g[j]);
}
}
}
for(int i=3;i<=n;i++)
{
for(int j=0;j<top;j++)
{
if((mp[i]&s[j])==0)
{
for(int p=0;p<top;p++)
{
if((s[j]&s[p])==0)
{
for(int q=0;q<top;q++)
{
if(((s[q]&s[p])==0)&&((s[q]&s[j])==0))
dp[i][p][j]=max(dp[i][p][j],dp[i-1][q][p]+g[j]);
}
}
}
}
}
}
int ans=0;
for(int i=0;i<top;i++)
{
for(int j=0;j<top;j++)
ans=max(ans,dp[n][i][j]);
}
cout<<ans<<endl;
}