状压DP,玄学WA

P2704 [NOI2001] 炮兵阵地

wangjinbo @ 2020-05-31 10:40:25

RT,本地AC,评测90分WA样例,在线IDE也是WA

样例本地输出6,在线IDE输出7

#include<bits/stdc++.h>
using namespace std;
char s[101][11];
int a[101];
long long dp[3][1024][1024];
int sum[1024];
int getsum(int x)
{
    int cnt=0;
    while(x){
        x-=x&(-x);
        cnt++;
    }
    return cnt;
}
int main()
{
    for(int i=0;i<1024;i++)
    sum[i]=getsum(i);
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        getchar();
        for(int j=1;j<=m;j++)
        {
            scanf("%c",&s[i][j]);
            a[i]*=2;
            if(s[i][j]=='H')a[i]++;
        }
    }
    for(int u=0;u<(1<<m);u++)
    {
        if((u&a[1])||(u&(u<<1))||(u&(u<<2)))continue;
        dp[1][u][0]=sum[u];
    }
    for(int u=0;u<(1<<m);u++)
    {
        if((u&a[1])||(u&(u<<1))||(u&(u<<2)))continue;
        for(int v=0;v<(1<<m);v++)
        {
            if((v&a[2])||(v&(v<<1))||v&(v<<2)||(v&u))continue;
            dp[2][v][u]=sum[v]+sum[u];
        }
    }
    for(int i=3;i<=n;i++)
    {
        for(int u=0;u<(1<<m);u++)
        {
            if((u&a[i])||(u&(u<<1))||(u&(u<<2)))continue;
            for(int v=0;v<(1<<m);v++)
            {
                if((v&a[i-1])||(v&(v<<1))||(v&(v<<2))||(v&u))continue;
                for(int w=0;w<(1<<m);w++)
                {
                    if((w&a[i-2])||(w&(w<<1))||(w&(w<<2))||(w&v)||(w&u))continue;
                    dp[i%3][u][v]=max(dp[i%3][u][v],dp[(i-1)%3][v][w]+sum[u]);
                }
            }
        }
    }
    long long ans=0;
    for(int u=0;u<(1<<m);u++)
    for(int v=0;v<(1<<m);v++)
    ans=max(ans,dp[n%3][u][v]);
    printf("%lld\n",ans);
    return 0;
}

by chenxinyang2006 @ 2020-05-31 10:41:19

那你大概率UB了


by 2xyz @ 2020-07-12 20:37:53

Me too.


|