蒟蒻求助
炮兵阵地【状压DP】 (代码不知道哪里错了)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[2][1001][1001],num[10001];
int s[10001],g[1001];
int m,n,t;
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=0;j<n;j++)
{
char s1;
cin>>s1;
if(s1=='P')
g[i]+=1<<(n-j-1);
}
for(int i=0;i<(1<<n);i++)
if(!(i&i>>1)&&!(i&i>>2))
{
s[t++]=i;
for(int j=0;j<n;j++)
num[i]=(i>>j&1);
}
for(int i=1;i<=m+2;i++)
for(int a=0;a<t;a++)//i
for( int b=0;b<t;b++)//i-1
for(int c=0;c<t;c++)//i-2
{
if(!(s[a]&s[c])&&!(s[a]&s[b])&&!(s[b]&s[c])&&(g[i]&s[a])==s[a]&&(g[i-1]&s[b])==s[b])
f[i&1][a][b]=max(f[i&1][a][b],f[(i-1)&1][b][c]+num[s[a]]);
}
printf("%d",f[m+2][0][0]);
}