zhaomingrui @ 2018-11-01 16:03:35
哪里错了?
#include<bits/stdc++.h>
using namespace std;
struct sd{
int data,num;
}in[15][2050];
int n,m,two[15],cnt,sum[15][100],dp[205][205][205],inv[105],max_ans;
char s[105][15];
bool check(int x)
{
if(!(x&(x<<1))&&!(x&(x<<2))&&!(x&(x>>1))&&!(x&(x>>2))) return true;
else return false;
}
void build(int x,int now,int y,int tot)
{
if(now==m)
{
if(check(x))
{
in[y][++cnt].num=x;
in[y][cnt].data=tot;
//printf("%d %d\n",x,tot);
}
return;
}
else
{
if(s[y][now+1]=='P') build(x+two[now],now+1,y,tot+1);
build(x,now+1,y,tot);
}
return;
}
inline void pre_work()
{
two[0]=1;
for(int i=1;i<=20;++i) two[i]=two[i-1]*2;
for(int i=1;i<=n;++i)
{
cnt=0;
build(0,0,i,0);
inv[i]=cnt;
}
for(int i=1;i<=inv[1];++i)
for(int j=1;j<=inv[2];++j)
if(!(in[1][i].num&in[2][j].num))
dp[2][j][i]=in[1][i].data+in[2][j].data;
}
int main()
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%s",s[i]+1);
pre_work();
for(int i=3;i<=n;++i)
for(int j=1;j<=inv[i];++j)
for(int h=1;h<=inv[i-1];++h)
for(int k=1;k<=inv[i-2];++k)
{
if(!(in[i][j].num&in[i][h].num)&&!(in[i][k].num&in[i][j].num)&&!(in[i][h].num&in[i][k].num))
dp[i][j][h]=max(dp[i-1][h][k]+in[i][j].data,dp[i][j][h]);
}
max_ans=0;
for(int i=1;i<=inv[n-1];++i)
for(int j=1;j<=inv[n];++j)
max_ans=max(max_ans,dp[n][j][i]);
printf("%d",max_ans);
return 0;
}