BZOJ_2064_分裂_状压DP
BZOJ_2064_分裂_状压DP
Description
Input
Output
Sample Input
3 1 2 3
Sample Output
2
数据范围:
对于100%的数据,n1,n2<=10,每个数<=50
对于30%的数据,n1,n2<=6,
观察到可以合并然后分解。
我们求最多能合并成多少块,然后用n1+n2减去2倍的它。
设f[i][j]表示左边选择的状态为i,右边选择的状态为j最多能合并成几块。
考虑预处理出来和左边一个状态和相等的右边有哪些状态,挂上链DP即可。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 1050
int n1,n2,s1[N],s2[N],mask1,mask2,a[11],b[11];
int f[N][N],sum,head[N],to[N*N],nxt[N*N],cnt;
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
void upd(int &x,int y) {
if(x<y) x=y;
}
int main() {
// freopen("apart.in","r",stdin);
// freopen("apart.out","w",stdout);
int i,j,k,l;
scanf("%d",&n1);
for(i=1;i<=n1;i++) scanf("%d",&a[i]),sum+=a[i];
scanf("%d",&n2);
for(i=1;i<=n2;i++) scanf("%d",&b[i]);
mask1=(1<<n1)-1; mask2=(1<<n2)-1;
for(i=1;i<=mask1;i++) for(j=1;j<=n1;j++) if(i&(1<<(j-1))) s1[i]+=a[j];
for(i=1;i<=mask2;i++) for(j=1;j<=n2;j++) if(i&(1<<(j-1))) s2[i]+=b[j];
for(i=1;i<=mask1;i++) {
for(j=1;j<=mask2;j++) {
if(s1[i]==s2[j]) add(i,j),f[i][j]=1;
}
}
for(i=1;i<=mask1;i++) {
int ui=mask1-i;
for(j=ui;j;j=(j-1)&ui) {
for(k=head[i];k;k=nxt[k]) {
for(l=head[j];l;l=nxt[l]) {
if((to[k]&to[l])==0) {
upd(f[i+j][to[k]+to[l]],f[i][to[k]]+1);
}
}
}
}
}
printf("%d\n",n1+n2-2*f[mask1][mask2]);
}
BZOJ_2064_分裂_状压DP的更多相关文章
- BZOJ_1076_[SCOI2008]奖励关_状压DP
		
BZOJ_1076_[SCOI2008]奖励关_状压DP 题意: 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛 ...
 - BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS
		
BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...
 - BZOJ_5369_[Pkusc2018]最大前缀和_状压DP
		
BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...
 - 分裂 BZOJ2064 状压DP
		
分析: 这个题很好啊,比起什么裸的状压DP高多了! 我们可以考虑,什么时候答案最大:全合并,之后再分裂 这样,我们必定可以得到答案,也就是说答案必定小于n+m 那么我们可以考虑,什么时候能够使答案更小 ...
 - 【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)
		
上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点) ...
 - [poj1185]炮兵阵地_状压dp
		
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
 - 2018.10.24 bzoj2064: 分裂(状压dp)
		
传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...
 - [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp
		
管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...
 - [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp
		
Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...
 
随机推荐
- Java 调用OPENOFFIC 转换文档类型
			
public static void office2PDF(String sourceFile, String destFile) { try { File inputFile = new File( ...
 - RGB颜色空间alpha混合的方法
			
http://blog.csdn.net/xhhjin/article/details/6444782http://blog.csdn.net/xhhjin/article/details/64454 ...
 - Maven上传本地jar
			
1. 将Jar包安装到本地仓库 -- DgroupId和DartifactId构成了该jar包在pom.xml的坐标, 对应依赖的DgroupId和DartifactId -- Dfile表示需 ...
 - python爬虫,从hao123爬取网址信息
			
最近研究python的爬虫,小小程序,拿下来分享,本人使用python3.7,纯粹兴趣爱好,希望能帮助大家激发兴趣.从hao123,爬取各种网址信息,代码如下. import urllib.reque ...
 - Window下安装Gradle并在IDEA中配置
			
真是作死啊,Maven都只是用得半瓢水,还来搞Gradle,小心撩得一身骚啊. 下载Gradle 下载页面为:https://gradle.org/releases/ Gradle 4.1的下载地址: ...
 - C#如何遍历数组?
			
// 一维数组 int[] arr = { 1, 2, 3, 4, 5 }; foreach (int i in arr) { Console.WriteLine(i.ToString() + &qu ...
 - TP  接收post请求使用框架自带函数I()防止注入
			
<input id="dele_id[]" value="1" type="checkbox" /> <input id= ...
 - jQuery+bootstrap实现美化警告/确认/提示对话框插件
			
http://www.html580.com/12067/demo http://craftpip.github.io/jquery-confirm/
 - 九度OJ 1169:比较奇偶数个数 (基础题)
			
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9459 解决:3146 题目描述: 第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES. 输入 ...
 - mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
			
如果你是mac ,你删除as ,删不干净也正常,你会发现安装的时候,前面的东西也在.配置文件在,会导致你以前的错误不想要的东西都在. 废话不多说,复制粘贴就是干!!!!~~~~~~~~ 第一步: 复 ...