同HDU 4539 只要把限制条件改一下即可 改成滚动数组又写了一遍
#include "stdio.h"
#include "string.h"
int b[]={1,2,4,8,16,32,64,128,256,512,1024,2048};
int dp[2][61][61],sum[101][61],mark[61];
char data[101][11];
int Max(int a,int b)
{
if (a<b) return b; else return a;
}
int main()
{
int n,m,i,j,cnt,aim,l,k,ans;
while (scanf("%d%d",&n,&m)!=EOF)
{
for (i=0;i<n;i++)
scanf("%s",data[i]);
cnt=0;
aim=1<<m;
for (i=0;i<aim;i++)
{
if (i&(i<<1)) continue;
if (i&(i<<2)) continue;
mark[cnt++]=i;
}
memset(sum,0,sizeof(sum));
for (i=0;i<n;i++)
for (j=0;j<cnt;j++)
for (k=0;k<m;k++)
if (data[i][k]=='P' && (b[k]&mark[j]))
sum[i][j]++;
memset(dp,0,sizeof(dp));
for (i=0;i<cnt;i++)
dp[0][i][0]=sum[0][i];
for (i=1;i<n;i++)
for (j=0;j<cnt;j++)
for (l=0;l<cnt;l++)
{
if (mark[j]&mark[l]) continue;
for (k=0;k<cnt;k++)
{
if (mark[j]&mark[k]) continue;
if (mark[l]&mark[k]) continue;
dp[i%2][j][l]=Max(dp[i%2][j][l],dp[1-i%2][l][k]+sum[i][j]);
}
}
ans=0;
for (i=0;i<cnt;i++)
for (j=0;j<cnt;j++)
ans=Max(ans,dp[1-n%2][i][j]);
printf("%d\n",ans);
}
return 0;
}