#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
int s1[101];
int n,m;
int dp[110][100][100];
int status[1500];
int x=0;
int func(int x)
{
int ctx = 0;
while(x)
{
ctx++;
x = x&(x-1);
}
return ctx;
}
void init(int l)
{
x=0;
for(int i=0;i<1<<m;i++)
{
if(i & s1[l]) continue;
if(i & i<<1 || i & i<<2 || i & i>>1 || i & i>>2) continue;
status[x++]=i;
// cout<<status[x-1];
}
// cout<<endl;
}
int main(int argc, char const *argv[])
{
// freopen("input","r",stdin);
// freopen("output","w",stdout);
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(s1,false,sizeof(s1));
memset(dp,false,sizeof(dp));
for(int i=0;i<n;i++)
for (int j = 0; j < m; ++j)
{
char c;
// scanf("%c",&c);
cin>>c;
if(c=='H')
s1[i]+=1<<(m-j-1);
}
init(0);
for(int i=0;i<x;i++)
{
dp[0][i][0]=func(status[i]);
// cout<<func(status[i]);
}
int status1[1500],status2[1500];
memcpy(status1,status,sizeof(status));
int x1=x;
memset(status2,false,sizeof(status2));
int x2=1;
for(int i=1;i<n;i++)//I行
{
init(i);
for(int j=0;j<x;j++)// 第j个状态
for(int v=0;v<x1;v++)//i-1行的第j个状态
{
if(status[j] & status1[v]) continue;
for (int k = 0; k < x2; ++k)//i-2
{
if(status[j] & status2[k]) continue;
if(dp[i-1][v][k] + func(status[j]) > dp[i][j][v])
dp[i][j][v]= dp[i-1][v][k]+ func(status[j]);
}
// cout<<' '<<i<<' '<<j <<' '<<v <<dp[i][j][v]<<endl;
}
memcpy(status2,status1,sizeof(status2));
memcpy(status1,status,sizeof(status));
x2=x1;
x1=x;
}
int max=0;
for(int j=0;j<x;j++)
for(int v=0;v<x2;v++)
if(dp[n-1][j][v]>max) max=dp[n-1][j][v];
printf("%d\n",max);
}
return 0;
}
poj 1185
最新推荐文章于 2019-04-06 23:04:49 发布