WA on#7 90pts

P2704 [NOI2001] 炮兵阵地

OutsideR_ @ 2024-04-11 13:24:14

RT,悬关


by OutsideR_ @ 2024-04-11 13:24:24

#include <iostream>
using namespace std;
int n,m;
char a[105][15];
int dp[2050][2050][105]; 
int hefa[2050],h=1;
int ban[2050];
int one[2050];
int ans=0;
int got(int x){
    int t=0;
    while(x){
        if(x&1){
            t++;
        }
        x>>=1;
    }
    return t;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(a[i][j]=='P'){
                ban[i]=ban[i]|(1<<j); 
            }
        }
    }
    for(int f=1;f<(1<<(m+1));f++){
        if(f&1==1)continue;
        if((((f>>1)|(f<<1)|(f>>2)|(f<<2))&f)==0){
            hefa[h]=f;
            one[h]=got(f);
            if((f&ban[1])==f){
                dp[1][f][1]+=one[h];
                ans=max(ans,dp[1][f][1]);
            }
            h++;
        }
    }
    if(n==1){
        cout<<ans<<endl;
        return 0;
    }
    if(n>=2){
        for(int i=1;i<h;i++){
            int f1=hefa[i];
            if((f1&ban[2])!=f1)continue;
            for(int j=1;j<h;j++){
                int f2=hefa[j];
                if((i==j) || (f2&ban[1])!=f2)continue;
                if((f1&f2)!=0)continue;
                dp[f2][f1][2]=max(dp[f2][f1][2],dp[1][f2][1]+one[i]);
                ans=max(ans,dp[f2][f1][2]);
            }
        }
        if(n==2){
            cout<<ans<<endl;
            return 0;
        } 
    }
    if(n>2){
        for(int mm=3;mm<=n;mm++){
            for(int i=1;i<h;i++){
                int f1=hefa[i];
                if((f1&ban[mm])!=f1)continue;
                for(int j=1;j<h;j++){
                    int f2=hefa[j];
                    if((i==j) || (f2&ban[mm-1])!=f2)continue;
                    if((f1&f2)!=0)continue;
                    for(int k=1;k<h;k++){
                        int f3=hefa[k];
                        if((k==j) || (k==i) || (f3&ban[mm-2])!=f3)continue;
                        if((f3&f2)!=0)continue;
                        if((f3&f1)!=0)continue;
                        dp[f2][f1][mm]=max(dp[f2][f1][mm],dp[f3][f2][mm-1]+one[i]);
                        ans=max(ans,dp[f2][f1][mm]);
                    }
                }
            }
        }
        cout<<ans<<endl;
        return 0;
    }
}

|