(上不了p站我要死了,画师当然是wlop大大啦)

感觉这个做法还是挺难想的。

但还是总结一下思路吧。。

“只可意会不可言传的状压dp”(乱说)

Description

背景: 和久必分,分久必和。。。 题目描述: 中国历史上上分分和和次数非常多。。通读中国历史的WJMZBMR表示毫无压力。 同时经常搞OI的他把这个变成了一个数学模型。 假设中国的国土总和是不变的。 每个国家都可以用他的国土面积代替, 又两种可能,一种是两个国家合并为1个,那么新国家的面积为两者之和。 一种是一个国家分裂为2个,那么2个新国家的面积之和为原国家的面积。 WJMZBMR现在知道了很遥远的过去中国的状态,又知道了中国现在的状态,想知道至少要几次操作(分裂和合并各算一次操作),能让中国从当时状态到达现在的状态。

Input

第一行一个数n1,表示当时的块数,接下来n1个数分别表示各块的面积。 第二行一个数n2,表示现在的块,接下来n2个数分别表示各块的面积。

Output

一行一个数表示最小次数。

Sample Input

1 6

3 1 2 3

Sample Output

2

数据范围:

对于100%的数据,n1,n2<=10,每个数<=50

对于30%的数据,n1,n2<=6,

当然,我们很自然的想到一种方法,就是先把所有的国家合并起来,再挨个拆开,这样的次数是n+m-2,也就是上限。

那么什么时候可以使操作次数减少呢?我们发现,当有一些子集的和相等时,直接将这些合并再拆开,就可以免去多余的合并操作。(然而我这一步愣是没想出来)

从反方面想,每当找到这样的子集,就相当于找到了一次没用的操作,就可以拿上限去减。但是,如果合并方式不同,可能会产生不同的“没用操作”,而我们希望找到一种“没用操作”最多的操作方案,此时就是dp了。

而每一个国家可以被选或不被选,在有两种状态的情况下,我们很容易想到状压,而数据范围也是可以的。

那么对于一个子集状态的01串f[s](这里我将原来以及现在的国家状态合并到了一个二进制数中),这样的集合一定是由其一个子集和一个元素(国家)合并过来,不同的合并方式会造成不同的“没用操作”。所以对于每个集合,枚举集合中的每个元素,就相当于枚举不同的合并操作,取max即可。

如果该状态s中原来国家和现在国家的面积之和相等,则该状态也是一个“没用操作”,答案要++

完整代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int f[1<<20],sum1[1<<10],sum2[1<<10];
int n,m,w[15],v[15]; int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&v[i]);
for(int i=1;i<(1<<n);i++){
for(int j=i,k=1;j;j>>=1,k++) if(j&1) sum1[i]+=w[k]; }
for(int i=1;i<(1<<m);i++){
for(int j=i,k=1;j;j>>=1,k++) if(j&1) sum2[i]-=v[k];
}
for(int i=1;i<(1<<(n+m));i++){
for(int j=i,k=0;j;j>>=1,k++) if(j&1) f[i]=max(f[i],f[i^(1<<k)]);
if(sum1[i&((1<<n)-1)]+sum2[i>>n]==0) f[i]++;
}
printf("%d\n",n+m-2*f[(1<<(n+m))-1]);
return 0;
}

【bzoj2064】【分裂】状态压缩表示合并子集的更多相关文章

  1. UVA 11825 - Hackers&#39; Crackdown 状态压缩 dp 枚举子集

    UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集 ACM 题目地址:option=com_onlinejudge&Itemid=8&page=sh ...

  2. P5911 [POI2004]PRZ (状态压缩dp+枚举子集)

    题目背景 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 题目描述 桥已经很旧了, 所以它不能承受太重的东西.任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时 ...

  3. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  4. UVA 1508 - Equipment 状态压缩 枚举子集 dfs

    UVA 1508 - Equipment 状态压缩 枚举子集 dfs ACM 题目地址:option=com_onlinejudge&Itemid=8&category=457& ...

  5. UVA 11825 状态压缩DP+子集思想

    很明显的状态压缩思想了.把全集分组,枚举每个集合的子集,看一个子集是否能覆盖所有的点,若能,则f[s]=max(f[s],f[s^s0]+1).即与差集+1比较. 这种枚举集合的思想还是第一次遇到,果 ...

  6. BZOJ2064: 分裂

    2064: 分裂 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 360  Solved: 220[Submit][Status][Discuss] De ...

  7. POJ 1632 Vase collection【状态压缩+搜索】

    题目传送门:http://poj.org/problem?id=1632 Vase collection Time Limit: 1000MS   Memory Limit: 10000K Total ...

  8. [动态规划]状态压缩DP小结

     1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...

  9. POJ 2923 Relocation (状态压缩,01背包)

    题意:有n个(n<=10)物品,两辆车,装载量为c1和c2,每次两辆车可以运一些物品,一起走.但每辆车物品的总重量不能超过该车的容量.问最少要几次运完. 思路:由于n较小,可以用状态压缩来求解. ...

随机推荐

  1. 安装docker-下载加速、失败、成功安装

    前提:已装VMware虚拟机和Centos系统(具体安装包和过程可以百度) 先看这里:非root身份登录系统需要在下面的命令前加“sudo ”(sudo:代表给权限,用root登录则不需要输入) 一. ...

  2. 20191112 Spring Boot官方文档学习(4.5-4.6)

    4.5.国际化 Spring Boot支持本地化消息,因此您的应用程序可以迎合不同语言首选项的用户.默认情况下,Spring Boot messages在类路径的根目录下查找message resou ...

  3. mysql 恢复数据时中文乱码

    mysql恢复数据时中文乱码,解决办法. 用source命令导入mysql数据库怎么设置中文编码 1.导出数据时指定编码在导出mysql sql执行文件的时候,指定一下编码格式: mysqldump ...

  4. windows上Appium安装和使用

    1.Appium安装相关依赖工具: Android Studio或者Android SDK:https://developer.android.com/studio/Appium Desktop: h ...

  5. MinGW的安装

    我在MinGW官网下载到的版本是mingw-w64-install.exe,不过这差不多是一年以前的事了……   安装路径:D:\Program Files (x86)\mingw-w64\i686- ...

  6. TMS320F28335——下载程序到flash中

    一.让CCS软件支持Flash烧写 添加F28335.cmd文件 如图屏蔽掉25335_RAM_lnk.cmd 2.支持从Flash中拷贝文件到RAM中 添加DSP2832x_MemCopy.c 在主 ...

  7. django编辑框实现

    一些常用的: CKEditor UEEditor TinyEditor KindEditor 下载: http://kindeditor.net/down.php 使用方法: <textarea ...

  8. Python基础2——数据类型的操作

    列表操作 列表.字符串.元组的切片总结: num=[1, 2, 3, 4, 5, 6] 1.切片是通过下面来切,下标可以正数,也可以是复数.注意:复数的话,最后一个值的下标为-1,往前面推导就是-1, ...

  9. django基础篇04-自定义simple_tag和fitler

    自定义simple_tag app目录下创建templatetags目录 templatetags目录下创建xxpp.py 创建template对象register,注意变量名必须为register ...

  10. 2019-10-31-VisualStudio-2019-新特性

    title author date CreateTime categories VisualStudio 2019 新特性 lindexi 2019-10-31 08:48:27 +0800 2019 ...