#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int map[101];
//int dp[101][(1<<10)];
int dp[101][70][70];
int st[70];
int num[(1<<10)];
inline int jcount(int x)
{
int cnt=0;
while(x)
{
cnt++;
x&=(x-1);
}
return cnt;
}
int main()
{
int t=0;
for(int i=0;i<(1<<10);i++)
{
num[t++]=jcount(i);
//printf("%d\n",num[t-1]);
//system("pause");
}
int n,m;
while(~scanf("%d%d",&n,&m))
{
int ans=0;
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
char temp[15];
scanf("%s",temp);
int len=strlen(temp);
for(int j=0;j<len;j++)
{
if(temp[j]=='H')
map[i]+=(1<<j);
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// {
// if(map[i]&(1<<(j-1)))
// printf("0");
// else
// printf("1");
// }
// printf("\n");
// }
int k=0;
for(int i=0;i<(1<<m);i++)
{
if(!(i&(i<<2))&&!(i&(i<<1)))
{
st[k++]=i;
}
}
for(int i=0;i<k;i++)
{
if(map[1]&st[i])
continue;
dp[1][0][i]=num[st[i]];
ans=max(dp[1][0][i],ans);
for(int j=0;j<k;j++)
{
if(map[2]&st[j])
continue;
if(!(st[i]&st[j]))
dp[2][i][j]=num[st[i]]+num[st[j]];
}
}
for(int i=3;i<=n;i++)
{
for(int j=0;j<k;j++)
{
if(map[i]&st[j])
continue;
for(int u=0;u<k;u++)
{
if(map[i-1]&st[u])
continue;
for(int v=0;v<k;v++)
{
if(map[i-2]&st[v])
continue;
if(st[j]&st[u]||st[j]&st[v]||st[u]&st[v])
continue;
dp[i][u][j]=max(dp[i-1][v][u]+num[st[j]],dp[i][u][j]);
}
}
}
}
if(n==1) {printf("%d\n",ans); continue;}
ans=0;
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
{
ans=max(dp[n][i][j],ans);
}
}
printf("%d\n",ans);
}
return 0;
}
POJ 1185 状压DP
最新推荐文章于 2021-04-02 09:40:46 发布