_sry @ 2018-08-18 18:12:22
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define lowbit(x) x&-x
using namespace std;
inline int read()
{
int f=1,ans=0;char c;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
return ans*f;
}
int cont(int x)
{
int c=0;
while(x!=0)
{
x-=lowbit(x);
c++;
}
return c;
}
int ans[1101];
int s[101][1101];
int n,m;
void init(int ha,int t)
{
for(int i=0;i<=(1<<m)-1;i++)
{
if(i&(i<<1)) continue;
if(i&(i<<2)) continue;
if(i&(i>>1)) continue;
if(i&(i>>2)) continue;
if(i&t) continue;
s[ha][++ans[ha]]=i;
}
return;
}
int dp[101][1101][1101];
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
char str;
int t=0;
for(int j=1;j<=m;j++)
{
cin>>str;
if(str=='P') t=(t<<1);
else if(str=='H') t=(t<<1)+1;
}
init(i,t);
}
if(n==1)
{
cout<<ans[1];
return 0;
}
for(int i=1;i<=ans[2];i++)
{
for(int j=1;j<=ans[1];j++)
{
int s1=s[2][i],s2=s[1][j];
if(s1&s2) continue;
dp[2][i][j]=max(dp[2][i][j],cont(s1)+cont(s2));
}
}
for(int i=3;i<=n;i++)
{
for(int j=1;j<=ans[i];j++)
{
for(int k=1;k<=ans[i-1];k++)
{
for(int t=1;t<=ans[i-2];t++)
{
int s1=s[i][j],s2=s[i-1][k],s3=s[i-2][t];
if(s1&s2) continue;
if(s1&s3) continue;
if(s2&s3) continue;
dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][t]+cont(s1));
}
}
}
}
int sum=0;
for(int i=1;i<=ans[n];i++)
for(int j=1;j<=ans[n-1];j++)
{
if(s[n][i]&s[n-1][j]) continue;
sum=max(sum,dp[n][i][j]);
}
cout<<sum;
}
/*
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
*/
by lwyz123 @ 2019-06-28 15:29:10
你在里面开个memset(dp,0,sizeof(dp))试试