88 WA #2 状压dp求调!!! 悬赏(sin^2α+cos^2α)个关注
查看原帖
88 WA #2 状压dp求调!!! 悬赏(sin^2α+cos^2α)个关注
648756
Shadow_Lord楼主2023/8/23 18:40
#include<bits/stdc++.h>
using namespace std;
const int N=7e4+10;
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<<1)+(s<<3)+(ch^48),ch=getchar();
    return s*w;
}
int n,f[N],w[N],h[N],p[20],ax[20],ay[20],bx[20],by[20],c[20];
vector<int>v[100];
signed main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        ay[i]=read();ax[i]=read();by[i]=read();bx[i]=read();c[i]=read();
        v[by[i]].push_back(i);
    }
    for(int i=1;i<=n;i++)
    {
        int o=ay[i];
        for(int j=0;j<v[o].size();j++)
        {
            int id=v[o][j];
            if(((ax[id]>=ax[i]&&ax[id]<bx[i])||(ay[id]>ax[i]&&ay[id]<=ay[i]))&&c[id]!=c[i])
            {
                p[i]|=(1<<(id-1));
            }
        }
    }
    for(int i=0;i<(1<<n);i++)
    {
        f[i]=0x3f3f3f3f;
        int o=0;
        for(int j=1;j<=n;j++)
        {
            if((i>>(j-1))&1)
            {
                if((o|(1<<(c[j]-1)))!=o)
                {
                    o|=(1<<(c[j]-1));
                    w[i]++;
                }
                h[i]|=p[j];
            }
        }
    }
    f[0]=0;
    for(int i=0;i<(1<<n);i++)
    {
        for(int j=i;j;j=(j-1)&i)
        {
            if(((i-j)|h[j])!=(i-j))continue;
            f[i]=min(f[i],f[i-j]+w[j]);
        }
    }
    cout<<f[(1<<n)-1]<<"\n";
    return 0;
}
2023/8/23 18:40
加载中...