徯楠 @ 2018-09-21 18:39:35
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,m,ans;char s[15];
int a[105];int F,f[1050],num[1050];
int dp[105][1050][1050];//第n行上一行是第f【i】用第f【j】的数
void init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",s);
for(int j=m-1,k=1;j>=0;j--,k<<=1)if(s[j]=='P')a[i]+=k;
}
}
void pre(){
for(int i=0,k=0;i<(1<<m);i++,k=0){
if((i&(i<<1))||(i&(i<<2)))continue;
for(int j=0;j<m;j++)if(i&(1<<j))k++;
f[++F]=i;
num[F]=k;
}
return;
}
void DP(){
for(int i=1;i<=F;i++)for(int j=1;j<=F;j++)if(!((f[i]&a[2])||(f[j]&a[1])||(f[i]&f[j])||i==j))dp[2][i][j]=num[i]+num[j];
for(int l=3;l<=n;l++)for(int i=1;i<=F;i++)
if(!(f[i]&a[l]))for(int j=1;j<=F;j++)
if(!((f[j]&a[l-1])||(f[i]&f[j])||i==j))for(int k=1;k<=F;k++)
if(!((f[j]&f[k])||(f[i]&f[k])||(f[k]&a[l-2])||k==j||j==k))
dp[l][i][j]=max(dp[l][i][j],num[i]+dp[l-1][j][k]);
for(int i=1;i<=F;i++)for(int j=1;j<=F;j++)ans=max(ans,dp[n][i][j]);
printf("%d",ans);
return;
}
int main(){
init();pre();DP();
return 0;
}
结果是4???qwq
by Juanzhang @ 2018-09-21 19:15:57
%%%