rt wa34568 死活找不到哪错了
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=110;
const int W=N<<2;
int n,m,cnt;
int num[W],s[W],g[N][N];
int f[N][W][W],ans;
inline void dp () {
for (register int i=1;i<=cnt;i++) {
if ((s[i]|g[1][0])!=g[1][0]) continue;
f[1][1][i]=num[i];
for (register int j=1;j<=cnt;j++) {
if ((s[j]|g[2][0])!=g[2][0]) continue;
if ((s[i]&s[j])) continue;
f[2][i][j]=num[i]+num[j];
}
}
//row
for (register int i=3;i<=n;i++) {
for (register int j=1;j<=cnt;j++) {
for (register int k=1;k<=cnt;k++) {
for (register int t=1;t<=cnt;t++) {
if ((s[j]|g[i-2][0])!=g[i-2][0]) continue;
if ((s[k]|g[i-1][0])!=g[i-1][0]) continue;
if ((s[t]|g[i][0])!=g[i][0]) continue;
//-2 & -1
if ((s[j]&s[k])) continue;
//-1 & this
if ((s[k]&s[t])) continue;
//-2 & this
if ((s[j]&s[t])) continue;
f[i][k][t]=f[i-1][j][k]+num[t];
}
}
}
}
}
int main () {
scanf("%d%d",&n,&m);
for (register int i=1;i<=n;i++) {
for (register int j=1;j<=m;j++) {
char c; cin>>c;
if (c=='P') g[i][j]=1;
else g[i][j]=0;
g[i][0]+=pow(2,m-j)*g[i][j];
}
}
for (register int i=0;i<(1<<m);i++) {
if (i&(i<<1)|(i&(i<<2))) continue;
int sum=0;
for (register int j=0;j<m;j++) {
if (i&(1<<j)) sum++;
}
s[++cnt]=i;
num[cnt]=sum;
}
dp();
for (register int i=1;i<=cnt;i++) {
for (register int j=1;j<=cnt;j++) {
ans=max(ans,f[n][i][j]);
}
}
printf("%d\n",ans);
return 0;
}