萌新求助

P2704 [NOI2001] 炮兵阵地

淸梣ling @ 2021-07-03 17:14:26

本人写的是状压,先枚举可能结果,然后在用滚动数组dp但是 WA 了7个点,恳请各位 Dalao 查查错

#include<iostream>
#include<cstdio>
using namespace std;

struct node
{
    long long k;
    int num;
}str[1100];
int num;
int n,m,ans;
long long a[200];
int f[1100][1100][2];

void init(int k,long long a,int sum)
{
    if(k>=m)
     str[++num]=(node){a,sum};
    else
    {
        init(k+1,a,sum);
        init(k+3,a+(1ll<<k),sum+1);
    }
}
void nextline()
{
    char ch;
    while(ch=getchar(), ch=='\n'||ch=='\r');
}
int main()
{
    int i,j,k,q;
    char c;

    cin>>n>>m;nextline();
    init(0,0,0);
    for(i=1;i<=n;i++)
    {
        for(j=0;j<m;j++)
        {
            c=getchar();
            if(c=='H')
            a[i]+=1ll<<j;
        }
        nextline();
    }

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=num;j++)
        if(!(a[i]&str[j].k))
        {
            for(k=1;k<=num;k++)
            if(!(a[i-1]&str[k].k))
            if(!(str[j].k&str[k].k))
            {
                for(q=1;q<=num;q++)
                if(i<2||!(a[i-2]&str[q].k))
                if(!(str[j].k&str[q].k)&&!(str[k].k&str[q].k))
                {
                    f[k][j][i%2]=max(f[k][j][i%2],f[q][k][(i-1)%2]+str[j].num);
                    if(i==n)ans=max(ans,f[k][j][i%2]);
                }
            }
        }
    }
    cout<<ans;
    getchar();
    return 0;
}

by 淸梣ling @ 2021-07-03 17:15:23

最后的getchar是调试用的,交的时候去掉了


|