100pts,wa#11 #12

P2704 [NOI2001] 炮兵阵地

YNH_QAQ @ 2024-07-23 12:38:13

#include<bits/stdc++.h>
using namespace std;
int n,m,k,s[1005],g[1005],dp[102][1005][1005],ans,mp[103];
char ma[103];
int get(int x){
    int e=0;
    while(x>0){
        ++e;
        x-=x&(-x);
    }
    return e;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%s",ma);
        for(int j=0;j<m;j++)
          if(ma[j]=='H') mp[i]+=1<<j;
    }
    for(int i=0;i<=(1<<m)-1;i++)
        if(((i&(i<<1))==0)&&((i&(i<<2))==0)&&((i&(i>>1))==0)&&((i&(i>>2))==0)){
            s[++k]=i;
            g[k]=get(i);
            if((i&mp[1])==0) 
                dp[1][0][k]=g[k];
        }
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            if(((s[i]&s[j])==0)&&((s[j]&mp[2])==0))  
                dp[2][i][j]=max(dp[2][i][j],dp[1][0][i]+g[j]);
    for(int i=3;i<=n;i++)
        for(int j=1;j<=k;j++)
            if((mp[i]&s[j])==0) 
                for(int p=1;p<=k;p++)
                    if((s[p]&s[j])==0)
                        for(int q=1;q<=k;q++)
                            if(((s[q]&s[p])==0)&&((s[q]&s[j])==0))
                                dp[i][p][j]=max(dp[i][p][j],dp[i-1][q][p]+g[j]);
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            ans=max(dp[n][i][j],ans);
    cout<<ans;  
    return 0;
}

by StarsIntoSea_SY @ 2024-07-25 18:37:48

@YNH_QAQ 检查你n=1或2的情况


|