状压90pts求助,#1没过

P2704 [NOI2001] 炮兵阵地

123456a01 @ 2023-07-10 19:11:57

#include<bits/stdc++.h>
using namespace std;
int n,m,mp[102],num[200],a[102][200],f[102][200][200];
inline int maxx(int x,int y){
    return x>y?x:y;
}
void pre(){
    for(int k=1;k<=n;k++){
        for(int i=0;i<(1<<m);i++){
            if((i&mp[k])||(i&(i<<1))||(i&(i<<2))) continue;
            a[k][++a[k][0]]=i;
            if(num[i]||(!i)) continue;
            for(int j=0;j<m;j++){
                if(i&(1<<j)) num[i]++;
            }
        }
    }
}
int main(){
    char c;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        getchar();
        for(int j=1;j<=m;j++){
            c=getchar();
            mp[i]=(mp[i]<<1)|(c=='H');
        }
    }
    pre();
    for(int i=1;i<=a[1][0];i++) f[1][i][0]=num[a[1][i]];
    if(n==1){
        int x=0;
        for(int i=1;i<=a[1][0];i++) x=maxx(x,f[1][i][0]);
        printf("%d",x);
        return 0;
    }
    for(int i=1;i<=a[2][0];i++){
        for(int j=1;j<=a[1][0];j++){
            if(!(a[2][i]&a[1][j])) f[2][i][j]=f[1][j][0]+num[a[2][i]];
        }
    }
    for(int i=3;i<=n;i++){
        for(int j=1;j<=a[i][0];j++){
            for(int s1=1;s1<=a[i-1][0];s1++){
                if(a[i][j]&a[i-1][s1]) continue;
                for(int s2=1;s2<=a[i-2][0];s2++){
                    if((a[i][j]&a[i-2][s2])||(a[i-1][s1]&a[i-2][s2])) continue;
                    f[i][j][s1]=maxx(f[i][j][s1],f[i-1][s1][s2]+num[a[i][j]]);
                }
            }
        }
    }
    int x=0;
    for(int i=1;i<=a[n][0];i++)
        for(int j=1;j<=a[n-1][0];j++)
            x=maxx(x,f[n][i][j]);
    printf("%d",x);
    return 0;
}

by Futurecome @ 2023-07-10 19:24:15

尼玛


by Futurecome @ 2023-07-10 19:26:05

让我康康


by 123456a01 @ 2023-07-11 08:03:38

已找到问题,把getchar()换成scanf(“%s”)即可,已AC,此帖结


|