没错,又是我……求帮助……

P2704 [NOI2001] 炮兵阵地

雪绮晶 @ 2018-08-25 19:55:27

rt,这状压dp好毒瘤啊…………

#include<stdio.h>
#include<algorithm>
using namespace std;
int ans;
int dp[105][(1<<11)+5][(1<<11)+5],n,m;
char c;
int num[(1<<11)+5],s[(1<<11)+5];
int states,i;
int map[(1<<11)+5];
int count(int n) {
    int ans=0;
    while(n)
    {
        if((n&1)==1)
            ans++;
        n>>=1;
    }
    return ans;
}
int main ()
{
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            c=getchar();
            if(c=='H')
            {
                map[i]+=1<<j;
            }
        }
    getchar();
    }
    for(i=0; i<(1<<m); i++)
    {
        if(((i&(i<<1))==0)&&((i&(i<<2))==0)&&((i&(i>>1))==0)&&((i&(i>>2))==0))
        {
            num[++states]=count(i);
            s[states]=i;
        }
    }
    for(int j=0; j<(1<<m); j++)
    {
        if(j&map[i])
            continue;
        if(j&(j<<1))
            continue;
        if(j&(j<<2))
            continue;
        dp[0][j][0]=num[j];
    }
    for(int j=0; j<states; j++)
    {
        for(int k=0; k<states; k++)
        {
            if(s[j]&s[k])
                continue;
            if(s[j]&map[2])
                continue;
            dp[2][k][j]=max(dp[2][k][j],dp[1][0][j]+num[j]);
        }
    }
    for(int i=3; i<=n; i++)
        {
            for(int j=0; j<states; j++)
                {
                    if(map[i]&s[j])
                    continue;
                for(int k=0; k<states; k++)
                    {
                if(s[k]&s[j])
                    continue;
                for(int w=0; w<states; w++)
                {
                    if(s[w]&s[k])
                    continue;
                    if(s[w]&s[j])
                    continue;
                    dp[i][k][j]=max(dp[i][k][j],dp[i-1][w][k]+num[j]);
                }
            }
        }
    }
    for(int i=1; i<=states; ++i)
        for(int j=1; j<=states; ++j)
            ans=max(dp[n][i][j],ans);
    printf("%d",ans);
    return 0;
}

by 雪绮晶 @ 2018-08-25 19:57:17

我是萌新,刚学OI,求帮助qwq


by 雪绮晶 @ 2018-08-25 19:59:37

@陶文祥 @Miku初音 @AC我最萌

大佬,江湖救急啊!


by 雪绮晶 @ 2018-08-25 20:00:43

@陆麟瑞666


by 06ray @ 2018-08-25 20:01:06

现在刚学OI的都能AKIOI了


by 雪绮晶 @ 2018-08-25 20:01:57

@陆麟瑞666

这次省赛看我如何花式爆零qwq


by twelveZ @ 2018-08-25 21:54:15

@雪绮晶 前排卖船


by ciwomuli @ 2018-08-25 21:57:41

第一个bug map[i]+=1<<j;
状压从零位开始
此处应为j-1


by ciwomuli @ 2018-08-25 22:00:36

@雪绮晶
你的状压好魔性啊


by 雪绮晶 @ 2018-08-25 22:00:42

@ciwomuli (⊙o⊙)哦谢谢大佬


by 雪绮晶 @ 2018-08-25 22:01:38

@ciwomuli 毒瘤题都这样qwq


| 下一页