BZOJ 2064: 分裂|状压动规

来源:互联网 发布:如何在ubuntu下编程c 编辑:程序博客网 时间:2024/05/18 04:01

传说中只可意会不可言传的dp

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<set>#include<map>#include<queue>#include<vector>#define T 2222222using namespace std;int sum[T],f[T],n,m,K;int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&sum[1<<i>>1]);scanf("%d",&m);for(int i=1;i<=m;i++)    scanf("%d",&sum[1<<n+i>>1]),    sum[1<<n+i>>1]=-sum[1<<n+i>>1];n=n+m;K=(1<<n)-1;for(int i=1;i<=K;i++){int t=i&(-i);sum[i]=sum[t]+sum[i-t];for(int j=1;j<=n;j++)    if(i&(1<<j>>1))    {    int k=i-(1<<j>>1);    f[i]=max(f[i],f[k]);    }if(sum[i]==0)f[i]++;}cout<<n-2*f[K];return 0;}


0 0
原创粉丝点击