求助ACbut厌氧

P2704 [NOI2001] 炮兵阵地

light_searcher @ 2023-12-16 07:21:37

不开O2:一片绿

开O2:五彩斑斓

有没有大佬帮我看看咋了qwq


#include<bits/stdc++.h>
using namespace std;
const int N=105,M=15,K=66;
int n,m,g[K],c[K],cnt,h[M],f[N][K][K],ans;
char s[N][M];
int count(int x){
    int ans=0;
    while(x){
        if(x&1) ans++;
        x>>=1;
    }
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s",s[i]+1);
        for(int j=1;j<=m;j++)
            h[i]=(h[i]<<1)+(s[i][j]=='H'?1:0);
    }
    for(int i=0;i<(1<<m);i++)
        if(!(i&(i<<1))&&!(i&(i<<2))){
            g[++cnt]=i;
            c[cnt]=count(i);
            if(!(g[cnt]&h[1]))
                f[1][cnt][0]=c[cnt];
        }
    if(n==1){
        for(int i=1;i<=cnt;i++)
            if(!(g[i]&h[n]))
                ans=max(ans,f[n][i][0]);
        printf("%d",ans);
        return 0;
    }
    for(int i=1;i<=cnt;i++){
        if(g[i]&h[2]) continue;
        for(int j=1;j<=cnt;j++){
            if((g[j]&g[i])||(g[j]&h[1])) continue;
            f[2][i][j]=f[1][j][0]+c[i];
        }
    }
    for(int i=3;i<=n;i++)
        for(int j=1;j<=cnt;j++){
            if(g[j]&h[i]) continue;
            for(int k=1;k<=cnt;k++){
                if((g[j]&g[k])||(g[k]&h[i-1])) continue;
                for(int t=1;t<=cnt;t++){
                    if((g[j]&g[t])||(g[k]&g[t])||(g[t]&h[i-2])) continue;
                    f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+c[j]);
                }
            }
        }
    for(int i=1;i<=cnt;i++)
        for(int j=1;j<=cnt;j++)
            if(!(g[i]&g[j])&&!(g[i]&h[n])&&!(g[j]&h[n-1]))
                ans=max(ans,f[n][i][j]);
    printf("%d",ans);
    return 0;
}

by ran_qwq @ 2023-12-16 07:56:18

UB。


by light_searcher @ 2023-12-16 08:57:36

@ran_qwq 可不可以帮我修改一下


by ran_qwq @ 2023-12-16 09:05:59

为什么K是66?


by light_searcher @ 2023-12-16 09:44:42

@ran_qwq 一行里满足要求的方案数最多是61个,所以随便开了66


by light_searcher @ 2023-12-16 09:47:25

@ran_qwq

    for(int i=0;i<(1<<10);i++)
        if(!(i&(i<<1))&&!(i&(i<<2)))
            cnt++;

像这样测出来的


by light_searcher @ 2023-12-16 09:51:40

@light_searcher 哦60个


by UUSamuel @ 2024-05-17 18:39:11

GOOD


by Ender_stove @ 2024-07-18 22:05:53

@UUSamuel 你个傻逼


|