玄学WA#1,其他AC

P2704 [NOI2001] 炮兵阵地

Kaneki__Ken @ 2024-10-12 10:28:07

第一个点洛谷评测说是输出了5,我下载了数据,第一个点就是样例,但我在本地跑,答案是6。是正确的。开大数组或关闭O2都没用,求助orz

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,t,i,j,k,ans,ztkx[109][109],zt[109],num[109],shu[109],f[109][109][109];//状态很少 
char c[109][19];
void Pre(){
    int i,j,k,kk;
    bool ff;
    for(i=0;i<(1<<m);i++){//有效状态 
        if((i&(i<<1))==0&&(i&(i<<2))==0){
            zt[++zt[0]]=i;kk=0;
            for(j=0;(1<<j)<=i;j++){
                if(i&(1<<j))kk++;
            }
            num[zt[0]]=kk;
            for(k=1;k<=n;k++){
                ff=0;
                for(j=0;(1<<j)<=i;j++){
                    if((i&(1<<j))&&(shu[k]&(1<<j))==0){
                        ff=1;break;
                    }
                }
                if(ff==1)ztkx[zt[0]][k]=0;
                else ztkx[zt[0]][k]=1;
            }
        }
    }
}
signed main(){
    //freopen("1.in","r",stdin);freopen("1.out","w",stdout);
    cin>>n>>m;
    for(i=1;i<=n;i++){
        getchar();
        for(j=1;j<=m;j++){
            c[i][j]=getchar();
            shu[i]=(shu[i]<<1)+(c[i][j]=='P'?1:0);
        }
    }
    Pre();
    if(n==1){
        for(i=1;i<=zt[0];i++)if(ztkx[i][1])ans=max(ans,num[i]);
        printf("%lld\n",ans);
    }
    else{
        for(i=1;i<=zt[0];i++){//i行
            for(j=1;j<=zt[0];j++){//i-1行 
                if((zt[i]&zt[j])==0&&ztkx[j][1]&&ztkx[i][2]){
                    f[2][j][i]=max(f[2][j][i],num[i]+num[j]);
                    ans=max(ans,f[2][j][i]);
                }
            }
        }
        for(t=3;t<=n;t++){ 
            for(i=1;i<=zt[0];i++){//i行
                for(j=1;j<=zt[0];j++){//i-1行 
                    for(k=1;k<=zt[0];k++){//i-2行 
                        if((zt[i]&zt[j])==0&&(zt[i]&zt[k])==0&&(zt[k]&zt[j])==0){
                            if(ztkx[i][t]&&ztkx[j][t-1]&&ztkx[k][t-2]){
                                f[t][j][i]=max(f[t][j][i],f[t-1][k][j]+num[i]);
                                ans=max(ans,f[t][j][i]);
                            }
                        }
                    }
                }
            }
        }
        printf("%lld\n",ans);
    }
    //fclose(stdin);fclose(stdout);
    return 0;
}

by earthling @ 2024-11-21 14:17:14

cu ball


|