【BZOJ2064】分裂

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,

题解:传说中的“传言可不,会意可只”的状压DP?(%neither_nor姜犇)

首先考虑最坏的情况,我们先将所有国家合到一起,然后再把它们一个个拆开,需要次数为n+m-2。

如果我们想让答案更优,方法就是先将所有国家合成x个国家,然后再将x个国家拆开,需要次数为n+m-2x,显然我们的x越大越好。也就是说,我们将把初始状态和结束状态分成尽可能多的集合,使得每个初始状态的集合都对应一个与它面积和相等的、结束状态的集合。

先想一种naive的做法:设f[i][j]表示已选出初始状态中的国家的状态为i(看不懂就直接认为i是一个状态),已选出结束状态中的国家的状态为j,所能形成的最多集合数。然后我们可以采用枚举子集的方法,时间复杂度惊人~

然后怎么办呢?神犇hz_lrd告诉我们,可以先假设我们已经知道了中间的状态,设初始状态中的集合为a,b,c,d,结束状态中的集合为A,B,C,D,然后我们把这些集合铺在两个序列上。第一个序列中依次放入集合a,b,c,d中的所有国家,第二个序列中依次放入A,B,C,D中的所有国家,然后对这两个序列求前缀和,其中a、A处的前缀和一定是相同的,b、B,c、C处也都相等,这就将问题转化成了:将两个序列随机排序,使得它们尽可能多的位置前缀和相等。

所以我们回到那个naive的做法,发现枚举子集根本没有必要,我们只需要枚举每个国家,一个一个加到两个状态i或j中去,一旦两个状态中的面积和相等,需要的次数就-2。为了转移更快,我们预处理出所有状态的面积和,然后转移就是O(2^(n+m)*(n+m))的了。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m;
int sn[1<<10],sm[1<<10],f[1<<10][1<<10],vn[12],vm[12];
int main()
{
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&vn[i]);
scanf("%d",&m);
for(i=1;i<=m;i++) scanf("%d",&vm[i]);
for(i=0;i<(1<<n);i++) for(j=1;j<=n;j++) if(i&(1<<j-1)) sn[i]+=vn[j];
for(i=0;i<(1<<m);i++) for(j=1;j<=m;j++) if(i&(1<<j-1)) sm[i]+=vm[j];
for(i=0;i<(1<<n);i++)
{
for(j=0;j<(1<<m);j++)
{
for(k=1;k<=n;k++) if(i&(1<<k-1)) f[i][j]=max(f[i][j],f[i^(1<<k-1)][j]);
for(k=1;k<=m;k++) if(j&(1<<k-1)) f[i][j]=max(f[i][j],f[i][j^(1<<k-1)]);
f[i][j]+=(sn[i]==sm[j])<<1;
}
}
printf("%d",n+m+2-f[(1<<n)-1][(1<<m)-1]);
return 0;
}

【BZOJ2064】分裂 状压DP的更多相关文章

  1. [BZOJ2064]分裂 状压dp

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

  2. BZOJ 2064: 分裂( 状压dp )

    n1+n2次一定可以满足..然后假如之前土地集合S1的子集subs1和之后土地集合S2的子集subs2相等的话...那么就少了2个+操作...所以最后答案就是n1+n2-少掉的最多操作数, 由状压dp ...

  3. 分裂 BZOJ2064 状压DP

    分析: 这个题很好啊,比起什么裸的状压DP高多了! 我们可以考虑,什么时候答案最大:全合并,之后再分裂 这样,我们必定可以得到答案,也就是说答案必定小于n+m 那么我们可以考虑,什么时候能够使答案更小 ...

  4. 2018.10.24 bzoj2064: 分裂(状压dp)

    传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...

  5. BZOJ_2064_分裂_状压DP

    BZOJ_2064_分裂_状压DP Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的 ...

  6. 状压dp学习笔记(紫例题集)

    P3451旅游景点 Tourist Attractions 这个代码其实不算是正规题解的(因为我蒟蒻)是在我们的hzoj上内存限制324MIB情况下过掉的,而且经过研究感觉不太能用滚动数组,所以那这个 ...

  7. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  8. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  9. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

随机推荐

  1. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何设置页面跳转

    TC3中,可以点击某个按钮,改变所显示的视图,然后从你写好的页面中选择一个要跳过去的页面   当然,在跳过去的页面上再做一个按钮可以跳回主页面也是必须的     更多教学视频和资料下载,欢迎关注以下信 ...

  2. 香蕉派 Banana pi BPI-M1+ 双核开源单板计算机. 板载WIFI

     Banana PI BPI-M1+是一款高性能双核开源硬件单板计算机,Banana PI BPI-M1+是一款比树莓派更强悍的双核Android4.4与Linux产品. Banana PI BP ...

  3. EffectManager

    using UnityEngine; using System.Collections; public class EffectManager : MonoBehaviour { public Ani ...

  4. Python——描述符(descriptor)解密

    本文由 极客范 - 慕容老匹夫 翻译自 Chris Beaumont.欢迎加入极客翻译小组,同我们一道翻译与分享.转载请参见文章末尾处的要求. Python中包含了许多内建的语言特性,它们使得代码简洁 ...

  5. 【Python】help与dir的用法

    当你给dir()提供一个模块名字时,它返回在那个模块中定义的名字的列表.当没有为其提供参数时, 它返回当前模块中定义的名字的列表. 如果您需要快速获取任何的Python函数或语句的信息,那么您可以使用 ...

  6. UVA 6475 Effective Infection Time

    You are estimating the threat level of quarantined zones that have been abandoned to the infection. ...

  7. 严重: Exception sending context initialized event to listener instance of class org.springframework.we

    2014-6-1 0:47:25 org.apache.catalina.core.AprLifecycleListener init 信息: The APR based Apache Tomcat ...

  8. 架构师-盛大许式伟VS金山张宴

    许式伟:作为系统架构师,您一般会从哪些方面来保证网站的高可用性(降低故障时间)? 张宴:很多因素都会导致网站发生故障,从而影响网站的高可用性,比如服务器硬件故障.软件系统故障.IDC机房故障.程序上线 ...

  9. 10张思维导图带你学习【Java​Script】

    思维导图小tips:思维导图又叫心智图.是表达发射性思维的有效的图形思维工具 ,它简单却又极其有效,是一种革命性的思维工具.思维导图运用图文并重的技巧.把各级主题的关系用相互隶属与相关的层级图表现出来 ...

  10. 浅谈Java中的System.gc()的工作原理

    很多人把Java的“效率低下”归咎于不能自由管理内存,但我们也知道将内存管理封装起来的好处,这里就不赘述. Java中的内存分配是随着new一个新的对象来实现的,这个很简单,而且也还是有一些可以“改进 ...