#include <iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105;
const int maxok=60;
int ok[maxok];
int tot=0;
int num[(1<<10)]={0};
int f[maxn][(1<<10)][(1<<10)]={0};
int a[maxn]={0};
int main()
{
int n,m;
cin>>n>>m;
int maxs=(1<<m);
for(int i=0;i<maxs;i++)
{
if((i&(i>>1)) || (i&(i>>2))) continue;
ok[tot++]=i;
}
for(int i=0;i<tot;i++)
{
int x=ok[i];
while(x!=0)
{
num[ok[i]]+=(x&1);
x>>=1;
}
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
char ch;
scanf(" %c",&ch);
if(ch=='H') a[i]=a[i]^(1<<j);
}
if(n==0 || m==0)
{
cout<<0<<endl;
exit(0);
}
if(n==1)
{
int ans=0;
for(int i=0;i<60;i++)
{
int x=ok[i];
if(num[x]<=ans || a[0]&x) continue;
ans++;
}
cout<<ans<<endl;
exit(0);
}
for(int s1=0;s1<tot;s1++)
for(int s2=0;s2<tot;s2++)
{
int x=ok[s1],y=ok[s2];
if(x&y) continue;
if(x&a[0] || y&a[1]) continue;
f[1][x][y]=num[x]+num[y];
}
for(int i=2;i<n;i++)
{
for(int s3=0;s3<tot;s3++)
{
int z=ok[s3];
if(z&a[i]) continue;
for(int s1=0;s1<tot;s1++)
for(int s2=0;s2<tot;s2++)
{
int x=ok[s1],y=ok[s2];
if(x&y || x&z || y&z) continue;
if(f[i][y][z]<f[i-1][x][y]+num[z]) f[i][y][z]=f[i-1][x][y]+num[z];
}
}
}
int ans=0;
for(int s1=0;s1<tot;s1++)
for(int s2=0;s2<tot;s2++)
if(ans<f[n-1][ok[s1]][ok[s2]]) ans=f[n-1][ok[s1]][ok[s2]];
cout<<ans<<endl;
return 0;
}
poj1185
最新推荐文章于 2021-07-15 11:32:37 发布