学好久OI了,求助状压dp

P2704 [NOI2001] 炮兵阵地

WorldBest丶牛顿 @ 2018-10-26 20:26:40

先说问题:为什么这么写布星qwq

#include<bits/stdc++.h>
using namespace std;
int max(int a,int b){return a>b?a:b;}

int n,m,ans;
char s[11];
int num[1027];
int a[101][101];
int f[101][101][101];
//f[所在行][所在行的状态][上一行的状态] 

void add_num(int x)
{
    if(num[x]) return;
    int a=x;
    while(x)
    {
        x&=x-1;
        num[a]++;
    }
}//算出这种状态有多少部队

int main()
{
    std::ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1,t;i<=n;++i)
    {
        cin>>s;t=0;
        for(int j=0;j<m;++j)
            if(s[j]=='P') t=t<<1;
            else t=t<<1|1;
        for(int j=0;j<(1<<m);++j)
        {
            if((j&(j<<1))||(j&(j<<2))||(j&t)) continue;
            a[i][++a[i][0]]=j;//储存各种状态
            add_num(j);
        }
    }//a[i][j]存放可以放部队的位置

    a[0][0]=1;

    for(int i=1;i<=a[1][0];++i)
        f[1][i][1]=num[a[1][i]];

    for(int i=2;i<=n;++i)
        for(int j=1;j<=a[i][0];++j)
            for(int k=1;k<=a[i-1][0];++k)
                for(int l=1;l<=a[i-2][0];++l)//注意这里有个l,debug的时候看清楚 
                    if(!(a[i][j]&a[i-1][k]&a[i-2][l]))
                        f[i][j][k]=max(f[i][j][k],f[i-1][k][l]+num[a[i][j]]);

    for(int i=1;i<=a[n][0];++i)
        for(int j=1;j<=a[n-1][0];++j)
            ans=max(ans,f[n][i][j]);

    cout<<ans;
    return 0;
}

by 已注销%Jm9VScx @ 2018-10-26 20:27:53

你先这样,然后这样,最后那样就好了(逃


by WorldBest丶牛顿 @ 2018-10-26 20:27:58

dalao们觉得还缺注释我可以改 qwq


by WorldBest丶牛顿 @ 2018-10-26 20:28:17

@Forinser_666 QAQ


by WorldBest丶牛顿 @ 2018-10-26 20:29:05

数组大小可能是我看了一下题解随便开的。。qwq


by King_of_gamers @ 2018-10-26 20:29:55

你先这样,然后这样,最后那样就好了(逃


by Everlasting_Snow @ 2018-10-26 20:31:01

你先这样,然后这样,最后那样就好了(逃


by zhou_yk @ 2018-10-26 20:31:17

@炜哥 太强了(他是我们学校第一大佬)


by wxy_god @ 2018-10-26 20:31:40

这里写错了,那里也写错了,还有这里也写错了(逃


by King_of_gamers @ 2018-10-26 20:32:15

@周煜凯

来自神犇的嘲讽!!!!!!!!!!!!!!!!!!!!


by WorldBest丶牛顿 @ 2018-10-26 20:36:30


| 下一页