我觉得没什么问题呀?
#include<iostream>
using namespace std;
int n,m;
int dp[105][1205][1205],g[105],s[1205],num[1205];
int cnt=0;
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i<=n;i++){
for(int j = 0;j<m;j++){
char ch; cin>>ch;
if(ch=='P') g[i]+=(1<<(m-j-1));
}
}
// for(int i = 1;i<=n;i++) cout<<g[i]<<" "; cout<<endl;
for(int i = 0;i<(1<<m);i++){
if(!(i&i>>1)&&!(i&i>>2)) s[cnt++]=i;
int x = i;
while(x){
if(x&1) num[i]++;
x=x>>1;
}
}
// for(int i = 0;i<(1<<m);i++) cout<<num[i]<<" "; cout<<endl;
// for(int i = 0;i<cnt;i++) cout<<s[i]<<" "; cout<<endl;
for(int i = 3;i<=n;i++){
for(int j = 0;j<cnt;j++){
for(int a = 0;a<cnt;a++){
for(int b = 0;b<cnt;b++){
if(!(s[j]&s[a])&&!(s[j]&s[b])&&!(s[a]&s[b])&&g[i]&s[j]==s[j])
dp[i][j][a]=max(dp[i][j][a],dp[i-1][a][b]+num[s[j]]);
}
}
}
}
int ans=0;
for(int i = 0;i<cnt;i++)
for(int j = 0;j<cnt;j++)
ans=max(ans,dp[n][i][j]);
printf("%d",ans);
}