出了啥情况求助,最后一个点,a不了,每次只有一行,不管有几列就输出零

P2704 [NOI2001] 炮兵阵地

xiaoxiaoxiaoxiao_li @ 2022-07-12 21:01:17

过了本地oj,欢欢喜喜过来刷蓝题,结果100分,最后一个点爆零,只有一行的话不管有几列他只输出零求助

#include<bits/stdc++.h>
using namespace std;
long long  n,m,f[120][1010][1010],st[10000],td[10000],top,mod=100000000,ans,num[100000];//f[][][],第一维当前行,第二维当前状态,第三维上一行状态 
bool check(int x){
    if((x&(x<<1))&&(x&(x>>1)))return 0;
    if((x&(x<<2))&&(x&(x>>2)))return 0;
    else return 1;  
}
bool find(int x,int y){
    if(x&td[y])return 0;
    else return 1;
}
long count(long i){
    int c=0;
      while(i>0)
    {
        ++c;
        i-=i&(-i);
    }
    return c;
}
int main()
{
    cin>>m>>n;
    for(int i=1;i<=m;i++){
         td[i]=0;
        char t;
        for(int j=1;j<=n;j++){
            cin>>t;
            if(t=='H'){
                td[i]+=(1<<(n-j));
            }
        }
    }
    for(int i=0;i<(1<<n);i++){
        if(check(i))st[++top]=i;
    }

    for(int j=1;j<=top;j++){
        num[j]=count(st[j]);
        if(find(st[j],1)){ 
            f[1][j][0]=num[j];
        }
    }
    for(int i=1;i<=top;i++)
                        {
    for(int j=1;j<=top;j++)
                        {
            if(!find(st[i],1))continue;
            if(st[i]&st[j])continue;
            if(!find(st[j],2))continue;
            f[2][j][i]=max(f[2][j][i],f[1][i][0]+num[j]);
        }
}
    for(int i=3;i<=m;i++){
        for(int j=1;j<=top;j++){
            if(!find(st[j],i))continue;
            for(int k=1;k<=top;k++){
                if(!find(st[k],i-1))continue;
                if(st[j]&st[k])continue;
                for(int t=1;t<=top;t++){
                    if(!find(st[t],i-2))continue;
                if(((st[j]&st[t])==0)&&((st[t]&st[k])==0))
                        f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+num[j]);
                }
            }
        }
    }
    for(int i=1;i<=top;i++){
        for(int j=1;j<=top;j++){
            ans=max(ans,f[m][i][j]);
        }
    }
        cout<<ans;
    return 0;
}

by xi_11 @ 2022-09-22 16:34:16

@xiaoxiaoxiaoxiao_li 求下第一行符合状态下的最大值,再加个特判就OK了

        if(n==1){
         cout<<maxn;
         return 0;
}

by xi_11 @ 2022-09-22 16:39:22

@xiaoxiaoxiaoxiao_li

因为如果只有一行,应该是f[1][i][0],但0这个状况你枚举不到


by 罗逸朗 @ 2022-09-22 16:57:14

@yxh52cc 谢谢,号主被jc禁言了。我是他朋友,顺便此贴结。


by xi_11 @ 2022-09-22 17:58:01

@罗逸朗

?乐死我了(bishi

希望人没事


|