刚学状压求助,过不了样例

P2704 [NOI2001] 炮兵阵地

Priori_Incantatem @ 2019-11-09 15:48:27

RT,程序食用样例后输出 4

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int Maxn=100+20,Maxm=20,Maxr=(1<<10)+20,inf=0x3f3f3f3f;
int a[Maxn],f[3][Maxr][Maxr],s[Maxr];  //s[i]储存状态i中有多少个炮兵
bool vis[Maxr];  //vis[i]储存状态i是否合法
int n,m,ms,ans;
inline int read()
{
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
    return s*w;
}
int main()
{
    //freopen("in.txt","r",stdin);
    n=read(),m=read(),ms=1<<m;
    for(int i=1;i<=n;++i)
    {
        char opt[15];
        scanf("%s",opt+1);
        int len=strlen(opt+1);
        for(int j=1;j<=m;++j)
        {
            a[i]<<=1;
            if(opt[j]=='P')a[i]++;
        }
    }
    for(int x=0;x<ms;++x)
    {
        if(x & (x<<1) || x & (x<<2)){vis[x]=1;}
        for(int j=0;j<m;++j)
        if((x>>j) & 1)s[x]++;
    }
    for(int x=0;x<ms;++x)
    {
        if(vis[x] || x & a[1])continue;
        f[1][x][0]=s[x];
    }
    for(int x=0;x<ms;++x)
    {
        if(vis[x] || x & a[2])continue;
        for(int y=0;y<ms;++y)
        {
            if(vis[y] || y & a[1] || x & y)continue;
            f[2][x][y]=s[x]+s[y];
        }
    }
    for(int i=3;i<=n;++i)
    {
        for(int x=0;x<ms;++x)
        {
            if(vis[x] || x & a[i])continue;
            for(int y=0;y<ms;++y)
            {
                if(vis[y] || y & a[i-1]|| x & y)continue;
                for(int z=0;z<ms;++z)
                {
                    if(vis[z] || z & a[i-2] || x & z || y & z)continue;
                    f[i%3][x][y]=max(f[i%3][x][y],f[(i-1)%3][y][z]+s[x]);
                }
            }
        }
    }
    for(int x=0;x<ms;++x)
    {
        if(vis[x] || x & a[n])continue;
        for(int y=0;y<ms;++y)
        {
            if(vis[y] || y & a[n-1] || x & y)continue;
            ans=max(ans,f[n%3][x][y]);
        }
    }
    printf("%d\n",ans);
    return 0; 
}

by __ykl @ 2019-11-09 18:30:52

状态t与a[i]不冲突应该是(t | a[i])== a[i]吧


by __ykl @ 2019-11-09 18:33:53

或者输入那里应该改成

if(opt[j]=='H')a[i]++;


by Priori_Incantatem @ 2019-11-10 08:01:31

@刘开予2019

谢谢,AC了


|