【状压dp】Bzoj2064 分裂
Description
Input
Output
Sample Input
3 1 2 3
Sample Output
数据范围:
对于100%的数据,n1,n2<=10,每个数<=50
对于30%的数据,n1,n2<=6
题解
虽然数据小,但此题乍一看不可做。
于是我仔(cha)细(yue)思(ti)考(jie)。
有一种方法肯定是可以的,把以前的全部合并,再一个个分裂成现在的。
那么最少的方案怎么来呢?
如果以前的一部分可以单独对应(单独地合并分裂)到现在的一部分,就没必要把他们和剩下的再合到一起再分开了。
这个过程用dp解决。
为了方便,另以前的面积为正,现在的面积为负,于是就是要尽量的凑零。
于是我们要知道所有的选择的和。
这个用状压解决,另sum[S]表示把S对应的集合(转为二进制)的面积之和。
sum可以递推,用S&-S求出最小元素t,然后sum[S]=sum[t]+sum[S-t],常用技巧get。
f[S]表示S这个集合处理过程中最多能得到0的次数。
最优子结构,枚举每一个i∈S,f[S]=max(f[S^i])。
如果sum[S]=0,f[S]++。
最后答案就是n+m-2*f[Smax]。
n+m是最原始的做法,*2是一个0可以少一次合并一次分裂。
感觉也是一道不错的题。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=; int f[<<maxn],sum[<<maxn];
int main(){
int n,m,x;
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d",&sum[<<i]); scanf("%d",&m);
for(int i=n;i<n+m;i++){
scanf("%d",&x);
sum[<<i]=-x;
} int end=<<(n+m); for(int i=;i<end;i++){
int t=i&-i;
sum[i]=sum[t]+sum[i-t];
for(int j=;j<n+m;j++)
if(i&(<<j)) f[i]=max(f[i],f[i^(<<j)]);
if(!sum[i]) f[i]++;
} printf("%d",n+m-*f[end-]);
return ;
}
【状压dp】Bzoj2064 分裂的更多相关文章
- 【BZOJ2064】分裂 状压DP
[BZOJ2064]分裂 Description 背景:和久必分,分久必和...题目描述:中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力.同时经常搞OI的他把这个变成了一个 ...
- 分裂 BZOJ2064 状压DP
分析: 这个题很好啊,比起什么裸的状压DP高多了! 我们可以考虑,什么时候答案最大:全合并,之后再分裂 这样,我们必定可以得到答案,也就是说答案必定小于n+m 那么我们可以考虑,什么时候能够使答案更小 ...
- 2018.10.24 bzoj2064: 分裂(状压dp)
传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...
- BZOJ 2064: 分裂( 状压dp )
n1+n2次一定可以满足..然后假如之前土地集合S1的子集subs1和之后土地集合S2的子集subs2相等的话...那么就少了2个+操作...所以最后答案就是n1+n2-少掉的最多操作数, 由状压dp ...
- BZOJ_2064_分裂_状压DP
BZOJ_2064_分裂_状压DP Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的 ...
- 状压dp学习笔记(紫例题集)
P3451旅游景点 Tourist Attractions 这个代码其实不算是正规题解的(因为我蒟蒻)是在我们的hzoj上内存限制324MIB情况下过掉的,而且经过研究感觉不太能用滚动数组,所以那这个 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
随机推荐
- AOP的相关概念
- c# https请求
遇到Https网站,c# http请求的时候,总是报SSL连接错误.后来经搜索,发现有解决方案: .net 2.0 需要引入一个第三方组件:BouncyCastle.dll,这是我写的一个例子: p ...
- balanced binary tree(判断是否是平衡二叉树)
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- Day14 JavaScript
区分: JavaScript和JAVA一点关系没有,是一门单独的语言.(浏览器就是JavaScript的解释器) JavaScript代码存在形式: #这些代码一般都是在<head>< ...
- Scala编程入门---函数式编程
高阶函数 Scala中,由于函数时一等公民,因此可以直接将某个函数传入其他函数,作为参数.这个功能是极其强大的,也是Java这种面向对象的编程语言所不具备的. 接收其他函数作为函数参数的函数,也被称作 ...
- 爬虫之urllib包
urllib简介 简介 Python3中将python2.7的urllib和urllib2两个包合并成了一个urllib库 Python3中,urllib库包含有四个模块: urllib.reques ...
- JavaScript函数节流和函数防抖之间的区别
一.概念解释 函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段. 大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片.由于肉眼只能分辨出一定频率的变 ...
- php中$_FILES应用实例
允许用户从表单上传文件是非常有用的.先来看一段HTML表单代码 <html> <body> <form action="upload_file.php" ...
- Qt中绘制五子棋棋盘
一个需要做大作业的同学问我相关内容,就顺手写了一个,贴出来. 项目包含头文件 mainwindowh,源文件mainwindow.cpp和主函数main.cpp. 如下: mainwindow.h # ...
- 第二章 ArrayList源码解析
一.对于ArrayList需要掌握的七点内容 ArrayList的创建:即构造器 往ArrayList中添加对象:即add(E)方法 获取ArrayList中的单个对象:即get(int index) ...