萌新刚刚学状压过不了样例求助

P2704 [NOI2001] 炮兵阵地

_Aurore_ @ 2022-10-21 13:22:29

#include<bits/stdc++.h>
#define int long long
#define INF 1000000000000000
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} 
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
} 
int n,m,a[101];
int peo[1<<10],dp[1<<10][1<<10][3];
signed main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            char ch;cin>>ch;
            if(ch=='H')
                a[i]=a[i]*2+1;
            else
                a[i]=a[i]*2;
    }
    for(int i=0;i<(1<<m);i++){
        int x=i;
        while(x){
            if(x&1)
                peo[i]++;
            x>>=1;
        }
    }
    for(int i=0;i<(1<<m);i++)
        if(!(i&a[1])&&!(i&(i<<1))&&!(i&(i<<2)))
            dp[0][i][0]=peo[i];
    for(int i=0;i<(1<<m);i++)
        if(!(i&a[1])&&!(i&(i<<1))&&!(i&(i<<2)))
            for(int j=0;j<(1<<m);j++)
                if(!(j&a[2])&&!(j&(j<<1))&&!(j&(j<<2))&&!(i&j))
                    dp[i][j][1]=peo[i]+peo[j];
    int now=1;
    for(int i=3;i<=n;i++){
        now=(now==2)?0:now+1;
        for(int j=0;j<(1<<m);j++)
            if(!(j&a[i-1])&&!(j&(j<<1))&&!(j&(j<<2)))
                for(int k=0;k<(1<<m);k++)
                    if(!(k&a[i])&&!(k&(k<<1))&&!(k&(k<<2))&&!(j&k))
                        for(int l=0;l<(1<<m);l++)
                            if(!(l&j)&&!(l&k)&&!(l&&a[i-2])&&!(l&(l<<1))&&!(l&(l<<2)))
                                dp[j][k][now]=max(dp[j][k][now],dp[l][j][(!now)?2:now-1]+peo[k]);
    }
    int ans=0;
    for(int i=0;i<(1<<m);i++)
        if(!(i&&a[n-1])&&!(i&(i<<1))&&!(i&(i<<2)))
            for(int j=0;j<(1<<m);j++)
                if(!(i&j)&&!(j&a[n])&&!(j&(j<<1))&&!(j&(j<<2)))
                    ans=max(ans,dp[i][j][now]);
    cout<<ans;
    return 0;
} 

|