怎么一直T啊

P2704 [NOI2001] 炮兵阵地

Jerry_heng @ 2023-11-17 22:53:43

#include<bits/stdc++.h>
using namespace std;
int n,m,ans,dp[3][1024][1024],s[2010];
void getsum(int x){
    int y=x;
    while(x){
        s[y]+=x&1;
        x>>=1;
    }
}
int a[110];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            char ch;
            cin>>ch;
            a[i]+=(ch=='H')*(1<<(j-1));
        }
    for(int i=0;i<(1<<m);i++)getsum(i);
    for(int i=0;i<(1<<m);i++){
        bool pd=0;
        if(a[1]&i)continue;
        for(int j=1;j<=m;j++){
            if(!((i>>(j-1))&1))continue;
            pd|=(i>>(j-2))&1;
            pd|=(i>>(j-3))&1;
        }
        if(!pd)dp[0][0][i]=s[i];
    }
    for(int i=0;i<(1<<m);i++)
        for(int k=0;k<(1<<m);k++){
        bool pd=0;
        if(a[2]&i)continue;
        for(int j=1;j<=m;j++){
            if(!((i>>(j-1))&1))continue;
            pd|=(k>>(j-1))&1;
            pd|=(i>>(j-2))&1;
            pd|=(i>>(j-3))&1;
        }
        if(!pd)dp[1][k][i]=dp[0][0][k]+s[i];
    }
    for(int i=3;i<=n;i++)
        for(int j=0;j<(1<<m);j++){
            if(a[i]&j)continue;
            bool pd=0;
            for(int k=1;k<=m;k++){
                if(!((j>>(k-1))&1))continue;
                pd|=(j>>(k-2))&1;
                pd|=(j>>(k-3))&1;
                if(pd)break;
            }
            if(pd)continue;
            for(int l1=0;l1<(1<<m);l1++)
                for(int l2=0;l2<(1<<m);l2++){
                    pd=0;
                    for(int k=1;k<=m;k++){
                        if(!((j>>(k-1))&1))continue;
                        pd|=(l1>>(k-1))&1;
                        pd|=(l2>>(k-1))&1;
                        if(pd)break;
                    }
                    if(!pd)dp[(i-1)%3][l2][j]=max(dp[(i-1)%3][l2][j],s[j]+dp[(i-2)%3][l1][l2]);
                }
        }
    for(int i=0;i<(1<<m);i++)
        for(int j=0;j<(1<<m);j++)
            ans=max(ans,dp[(n-1)%3][i][j]);
    cout<<ans;
    return 0;
}

|