由于相邻三格不能有炮兵,用行来作为DP,转成一个$m$位的二进制,那么$f_{i,j,k}$表示第$i$行,$j$为第$i$行的状态,$k$为第$i-1$行的状态,设$1$表示有炮兵,那么$j\& k=0$时,这个状态才合法,若有$f_{i-1,k,l}$,也要满足上式才可以完成转移。
满足了竖着的条件,也要满足横的条件吧,预处理一下即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define gc getchar()
using namespace std;
inline void qr(int &x)
{
    x=0;char c=gc;int f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
    x*=f;
}
void qw(int x)
{
    if(x<0)x=-x,putchar(x%10+48);
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
int c[65],a[105],num[65],f[105][65][65];
int main()
{
    int n,m;qr(n),qr(m);
    for(int i=0;i<1<<m;i++)
    {
        bool bk=0;int cnt=0,sz=0;
        for(int j=0;j<m;j++)
        {
            if(i>>j&1)
            {
                if(cnt<=1&&sz){bk=1;break;}
                cnt=0;sz++;
            }
            else cnt++;
        }
        if(!bk)num[++num[0]]=i,c[num[0]]=sz;
    }
    for(int i=1;i<=n;i++)
    {
        char s[15];scanf("%s",s);
        for(int j=0;j<m;j++)
        {
            if(s[j]=='P')a[i]|=1<<j;
        }
    }
    memset(f,0xcf,sizeof(f));
    for(int i=1;i<=num[0];i++)
        if((num[i]|a[1])==a[1])f[1][i][0]=c[i];
    for(int i=2;i<=n;i++)//f[i][j][k] i行状态为j,i-1行状态为k。 
        for(int j=1;j<=num[0];j++)
            for(int k=1;k<=num[0];k++)if((num[j]&num[k])==0&&(num[j]|a[i])==a[i]&&(num[k]|a[i-1])==a[i-1])
            {
                if(i==2)f[i][j][k]=f[i-1][k][0]+c[j];
                else
                {
                    for(int l=1;l<=num[0];l++)if((num[j]&num[l])==0&&(num[l]|a[i-2])==a[i-2]&&(num[k]&num[l])==0)
                        f[i][j][k]=max(f[i][j][k],f[i-1][k][l]+c[j]);
                }
            }
    int ans=0;
    if(n!=1)
    {
        for(int j=1;j<=num[0];j++)
            for(int k=1;k<=num[0];k++)if((num[j]&num[k])==0&&(num[j]|a[n])==a[n]&&(num[k]|a[n-1])==a[n-1])
                ans=max(ans,f[n][j][k]);
    }
    else
        for(int i=1;i<=num[0];i++)if((num[i]|a[1])==a[1])ans=max(ans,f[1][i][0]);
    qw(ans);puts("");
    return 0;
}