(上不了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. back()是返回,也就是说,先加载地址到A页面,再打开页面到B页面,调用 back()方法,就返回到了A页面

    from selenium import webdriverdriver=webdriver.Firefox()driver.maximize_window()driver.get('http://w ...

  2. TCP网络编程(Socket通讯)

    TCP 网路编程: 1.TCP 三次握手: 第一次握手,客户端向服务器端发出连接请求,等待服务器确认. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求. 第三次握手,客户端再次向服 ...

  3. 爬取LeetCode题目——如何发送GraphQL Query获取数据

    前言   GraphQL 是一种用于 API 的查询语言,是由 Facebook 开源的一种用于提供数据查询服务的抽象框架.在服务端 API 开发中,很多时候定义一个接口返回的数据相对固定,因此要获得 ...

  4. API接口设计

    1.场景描述 比如说我们要做一款APP,需要通过api接口给app提供数据.假设我们是做商城,比如我们卖书的.我们可以想象下这个APP大概有哪些内容: 1)首页:banner区域(可以是一些热门书籍的 ...

  5. SpringBoot 使用 RestTemplate 调用exchange方法 显示错误信息

    SpringBoot使用RestTempate SpringBoot使用RestTemplate摘要认证 SpringBoot使用RestTemplate基础认证 SpringBoot使用RestTe ...

  6. win10上安装redis

    1.下载安装包: 下载地址: 链接:https://pan.baidu.com/s/1oGPrfQJvFz-fX_KNcTTNUw 提取码:eake 2.在适合的位置创建一个文件夹,并将下载到的压缩包 ...

  7. 二、JVM — 垃圾回收

    JVM 垃圾回收 写在前面 本节常见面试题 本文导火索 1 揭开 JVM 内存分配与回收的神秘面纱 1.1 对象优先在 eden 区分配 1.2 大对象直接进入老年代 1.3 长期存活的对象将进入老年 ...

  8. [51Nod1850] 抽卡大赛

    link $solution:$ 朴素 $dp$,暴力枚举选择 $i$ 号人的第 $j$ 张卡片,朴素 $dp$ 即可,时间复杂度 $O(n^4)$ . 考虑对于朴素 $dp$ 的优化,发现其实是一个 ...

  9. oracle在没

    db_user表中数据: name age nub 张三 13 13 张三 12 12 张三 12 13 张三 12 13 李四 12 12 李四 12 12 查询重复数据(一条) sql:selec ...

  10. rest_framework框架的认证、权限

    REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth", ] ...