WA#8#9悬关求调

P2704 [NOI2001] 炮兵阵地

114514xxx @ 2024-10-31 20:11:07

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int f[1<<11][1<<11][20];
int cnt[1<<11],sit[1<<11];
int num;
int a[205];
inline int get(int x){
    int tot=0;
    while(x){
        if(x&1)++tot;
        x>>=1;
    }
    return tot;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    char c;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;++j){
            cin>>c;
            a[i]<<=1;
            a[i]|=(c=='H'?1:0);
        }
    }
    for(int i=0;i<(1<<m);++i)
        cnt[i]=get(i);
    for(int i=0;i<(1<<m);i++)
        for(int j=0;j<(1<<m);j++)
            if(!(i&j || j&a[1] || j&a[2] || (i&(i<<1)) || (i&(i<<2)) || (j&(j<<1)) || (j&(j<<2))))
                f[i][j][2]=cnt[i]+cnt[j];
    for(int i=3;i<=n;i++){
        for(int j=0;j<(1<<m);++j){
            if(j&a[i-1] || (j&(j<<1)) || (j&(j<<2)))continue;
            for(int k=0;k<(1<<m);++k){
                if(k&a[i] || k&j || (k&(k<<1)) || (k&(k<<2)))continue;
                for(int l=0;l<(1<<m);++l){
                    if(l&a[i-2] || l&k || k&j || (l&(l<<1)) || (l&(l<<2)))continue;
                    f[j][k][i]=f[j][k][i]>(f[l][j][i-1]+cnt[k])?f[j][k][i]:(f[l][j][i-1]+cnt[k]);
                }
            }
        }
    }
    int ans=0;
    for(int i=0;i<(1<<m);++i){
        for(int j=0;j<(1<<m);++j){
            if(i&j||i&a[n-1]||j&a[n])continue;
            ans=max(f[i][j][n],ans);            
        }

    }
    cout<<ans;
}

by 114514xxx @ 2024-10-31 20:50:36

此贴终

if(!(i&j || j&a[1] || j&a[2] || (i&(i<<1)) || (i&(i<<2)) || (j&(j<<1)) || (j&(j<<2))))

改为

if(!(i&j || i&a[1] || j&a[2] || (i&(i<<1)) || (i&(i<<2)) || (j&(j<<1)) || (j&(j<<2))))

即可


|