注意到\(n\)很小,应该是状压DP

记原集合为\(S\),目标集合为\(T\),如果我们能把\(S\)分成\(x\)个不相交的非空子集,且这\(x\)个子集能和\(T\)中的一些不相交非空子集的和相等,那么最终答案就是\(n+m-2x\),其中\(n=|S|,m=|T|\)

因此我们要最大化\(x\),这就是DP的目标了

设\(f[x][y]\)表示\(S\)的子集\(x\)和\(T\)的子集\(y\),\(sum\)相等的最多能配几对

若\(sum[x]\not=sum[y]\),枚举删去\(x\)或\(y\)的一个元素
\[ f[x][y]=max\{f[x\oplus i][y],f[x][y\oplus j]\} \]
若\(sum[x]=sum[y]\),情况看起来复杂了

为了转移,我们似乎要再枚举子集,复杂度不能接受

但是这样想,既然\(sum[x]=sum[y]\),那么\(x\)和\(y\)至少配成了一对,若在其中删去一个元素,一定会减少一对

因此
\[ f[x][y]=1+max\{f[x\oplus i][y],f[x][y\oplus j]\} \]
这样省去了枚举子集,复杂度有保障

最终复杂度\(O((n+m)2^{n+m})\)

骚操作:如何统计\(sum[x]\)?

以前一直写

for(int S=0;S<(1<<n);S++)for(int i=0;i<n;i++)if(S&(1<<i))sum[S]+=a[i];

这样做是\(O(n2^n)\)的,实际上,完全可以省去一个\(O(n)\) (虽然\(n\)很小..)

类似统计二进制中1的个数一样,可以复用\(S\)的子集,方法就是用lowbit

也就是\(sum[x]=sum[x\oplus lowbit(x)]+sum[lowbit(x)]\)

边界是\(sum[1<<i]=a[i+1]\)

这样是\(O(2^n)\)的


#include<algorithm>
#include<iostream>
#include<cstdio>using namespace std;inline int rd(){int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}
#define space putchar(' ')
#define nextline putchar('\n')
void _(int x){if(!x)return;_(x/10);putchar('0'+x%10);}
void out(int x){if(!x)putchar('0');_(x);}const int MAXN = 10;inline void upmax(int &x,int y){x=max(x,y);}int a[MAXN],b[MAXN];
int f[1<<MAXN][1<<MAXN];
int sum1[1<<MAXN],sum2[1<<MAXN];
int n,m;int main(){n=rd();for(int i=1;i<=n;i++)sum1[1<<(i-1)]=a[i]=rd();m=rd();for(int i=1;i<=m;i++)sum2[1<<(i-1)]=b[i]=rd();for(int i=1;i<(1<<n);i++){sum1[i]=sum1[i^(i&-i)]+sum1[i&-i];}for(int i=1;i<(1<<m);i++){sum2[i]=sum2[i^(i&-i)]+sum2[i&-i];}for(int s=1;s<(1<<n);s++){for(int t=1;t<(1<<m);t++){for(int i=0;i<n;i++){if(s&(1<<i)) upmax(f[s][t],f[s^(1<<i)][t]);}for(int i=0;i<m;i++){if(t&(1<<i)) upmax(f[s][t],f[s][t^(1<<i)]);}if(sum1[s]==sum2[t])f[s][t]++;}}cout<<n+m-2*f[(1<<n)-1][(1<<m)-1];return 0;
}


转载于:https://www.cnblogs.com/ghostcai/p/9802403.html

[BZOJ] 2064: 分裂相关推荐

  1. Bzoj 2064 分裂 题解

    2064: 分裂 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 570  Solved: 350 [Submit][Status][Discuss] ...

  2. 2064: 分裂 - BZOJ

    Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中 ...

  3. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  4. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  5. 分裂游戏(bzoj 1188)

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

  6. BZOJ 1188: [HNOI2007]分裂游戏(multi-nim)

    Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1386  Solved: 840 [Submit][Status][Discuss] Descrip ...

  7. BZOJ 2135 刷题计划(贪心,求导,二分)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2135 是 hydro 的 BZOJ ...

  8. BZOJ 3731: Gty的超级妹子树

    Description 我曾在青山之中遇过你, 新竹做杖,鬓插紫茱萸. 跣足踏过无边丝雨, 又拾起燕川雪片片落如席-- Gty神(xian)犇(chong)从来不缺妹子-- 他又来到了一棵妹子树下,发 ...

  9. 【BZOJ1188】分裂游戏(博弈论)

    [BZOJ1188]分裂游戏(博弈论) 题面 BZOJ 洛谷 题解 这道题目比较神仙. 首先观察结束状态,即\(P\)状态,此时必定是所有的豆子都在最后一个瓶子中. 发现每次的转移一定是拿出一棵豆子, ...

最新文章

  1. python相对路径库_如何最简单、通俗地理解Python的搜索路径、相对路径、绝对路径?...
  2. 易评:软银收购ARM会扼住中国芯发展的咽喉吗?
  3. 让你了解什么是内存屏障
  4. html font后面跟多种字体
  5. MySQL实用第三方客户端工具收集
  6. java编译找不到符号_javac编译时找不到符号?
  7. python清空文件夹
  8. Flowable 数据库表结构 ACT_HI_DETAIL
  9. oracle12c清理游标,Oracle专题12之游标
  10. 【解决】打印机只打印第一页纸的问题
  11. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
  12. python如何获取权限_python 权限系统设计
  13. 小程序之跨平台黑魔法
  14. 西门子200PLC指令详解——位逻辑指令
  15. JAFFE表情库介绍
  16. JavaScript经纬度和地图坐标相互转换
  17. 学习技术的三部曲:WHAT、HOW、WHY【转】
  18. SFP光模块怎么配对光纤线缆
  19. Assuming drive cache: write through,可能不是错误信息,只是提示信息
  20. 汇报措辞:你懂得怎样向领导汇报吗(审阅、审批、批阅、批示、查阅)?

热门文章

  1. a标签跳转后关闭当前页面_微信小程序2020-day-2 导航项目(跳转三种形态)
  2. python写一个表白程序_520最实用的Python表白程序
  3. BUUCTF--练习场-- basic--上传文件漏洞经典靶场upload-labs-- Pass1-3(Pass4简单尝试)
  4. 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)
  5. mac安装brew简单方法
  6. WebBrowser的Cookie操作(与CookieContainer的关系)
  7. ASP.NET MVC3 中设置htmlAttribute
  8. 软件项目风险评估报告00
  9. [翻译]“LINQ to Objects”提供程序是否内置性能优化?
  10. 图像处理中腐蚀与膨胀的原理