BZOJ2064:分裂——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2064
Description
Input
Output
Sample Input
3 1 2 3
Sample Output
2
——————————————————————————————————
抄的hzwer的博客,但是只可意会不可言传是什么鬼?!
于是参考了https://www.cnblogs.com/philippica/p/4136176.html,虽然写法不同但是还是靠自己勉强理解了。
首先让我们考虑最坏情况,即我们完全可以将所有的数先合并再分开,那显然答案是n+m。
但是如果我们已经有了一堆数和答案中的一堆数和相同,那么我们只需要将这一堆数合并再分开,就能避免一次将这堆数并到其他数上再分开的两次操作。
所以我们设f[i]表示i状态(起始状态+终止状态)有多少堆数是相同的。
那么显然答案就是n+m-2*f[maxn](maxn=(1<<n+m)-1)。
接下来考虑怎么求f。
设sum[i]表示i状态时当前国土大小(起始为正,终止为负),这样当某个状态sum[i]=0时显然f[i]++。
sum[i]=sum[lowbit(i)]+sum[i-lowbit(i)]显然是对的。
接下来考虑状态转移:f[i]=max(f[i],f[j])(j是i状态的子集,但显然不用全部枚举)
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int N=;
const int INF=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int f[N],sum[N];
int main(){
int n=read();
for(int i=;i<=n;i++)sum[<<i>>]=read();
int m=read();
for(int i=;i<=m;i++)sum[<<(n+i)>>]=-read();
n+=m;
int t=<<n;
for(int i=;i<t;i++){
int lowbit=i&(-i);
sum[i]=sum[lowbit]+sum[i-lowbit];
for(int j=;j<=n;j++){
if(i&(<<j>>)){
int k=i-(<<j>>);
f[i]=max(f[i],f[k]);
}
}
if(!sum[i])f[i]++;
}
printf("%d\n",n-*f[t-]);
return ;
}
BZOJ2064:分裂——题解的更多相关文章
- BZOJ2064: 分裂
2064: 分裂 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 360 Solved: 220[Submit][Status][Discuss] De ...
- 【状压dp】Bzoj2064 分裂
Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中 ...
- Bzoj 2064 分裂 题解
2064: 分裂 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 570 Solved: 350[Submit][Status][Discuss] De ...
- bzoj2064: 分裂(集合DP)
......咸鱼了将近一个月,因为沉迷ingress作业越来越多一直没时间搞OI呜呜呜 题目大意:有一个初始集合(n个元素)和一个目标集合(m个元素)(1<=n,m<=10),两个操作 ...
- [BZOJ2064]分裂 状压dp
2064: 分裂 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 656 Solved: 404[Submit][Status][Discuss] De ...
- bzoj2064: 分裂(状压dp)
Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中 ...
- bzoj2064分裂(dp)
题目大意: 给定一个初始集合和目标集合,有两种操作:1.合并集合中的两个元素,新元素为两个元素之和 2.分裂集合中的一个元素,得到的两个新元素之和等于原先的元素.要求用最小步数使初始集合变为目标集合, ...
- 2018.10.24 bzoj2064: 分裂(状压dp)
传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...
- 【BZOJ2064】分裂 状压DP
[BZOJ2064]分裂 Description 背景:和久必分,分久必和...题目描述:中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力.同时经常搞OI的他把这个变成了一个 ...
随机推荐
- 几个常用的轻量级web服务
Node.js 安装:npm install http-server 使用:hs命令,可启动以当前目前为webroot的8080端口web服务,也可指定端口 Python 安装:内置 使用:pytho ...
- ruby 基础教程1-8-1
1.":class, instance_of?, :is_a?"都是Object类的方法,每个对象都可以调用 2.":class"方法用户获取对象归属类的名称 ...
- 百度地图标注及结合ECharts图谱数据可视化
本示例中根据企业位置经纬度,在页面右侧百度地图中标注企业名称.同时页面左侧ECharts图谱饼状图用于统计企业行业与注册资本.当右侧百度地图缩放拖拽,左侧ECharts图谱根据右侧地图上出现的企业动态 ...
- liunx环境下安装禅道
环境: vm12.5.2 CentOS-7-x86_64 ZenTaoPMS.9.1.stable.zbox_64 SecureCRT 8.0 因为liunx环境下配置apache, php, mys ...
- 158. Valid Anagram【LintCode by java】
Description Write a method anagram(s,t) to decide if two strings are anagrams or not. Clarification ...
- Caching Data in the Architecture (C#)
http://www.asp.net/web-forms/tutorials/data-access/caching-data/caching-data-in-the-architecture-cs ...
- Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager
出现问题的原因: 在将springboot项目部署到Linux下的Tomcat中,项目无法正常启动(本地能正常运行),Tomcat启动日志中出现: Caused by: java.lang.NoCla ...
- 基于NABCD评论“探路者”Alpha版作品
1.分析 N(Need):”为了重温贪吃蛇这一经典游戏,本组的选题定为贪吃蛇游戏,并在此基础上进行了新的创新,将普通的贪吃蛇游戏改为单词版贪吃蛇.市面上的英语单词背记软件对于那些缺少英语学习兴趣.毅力 ...
- 常用算法Java实现之选择排序
选择排序算法在每一步中选取最小值来重新排序,通过选择和交换来实现排序. 具体流程如下: 1.首先从原数组中选择最小的1个数据,将其置于第一个位置. 2.然后从剩下的数据中再选择其中最小的一个数据,并将 ...
- C++视频教学
http://open.163.com/movie/2010/1/E/4/M6LDTAPTU_M6LFSTGE4.html http://open.163.com/movie/2010/1/N/5/M ...