蒟蒻过不了样例qwq

P2704 [NOI2001] 炮兵阵地

徯楠 @ 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

%%%


|