这道题初看真的毫无思路,又是合并又是分裂的

但实际上我们知道,当两组和相等的时候才能由一组变成另一组

我们将初始状态和最终状态划分成若干对,每对中的两组元素和相等的

不难发现,最少步骤=n+m-2*对数

因为在一对不能再划分的组中,具有k个元素变换到具有j个元素所花的最短步骤是k+j-2

于是问题就转化为了怎么划分,划分的对数最多

由于n,m<=10,这样我们就可以把选取状况用01二进制表示来解决了;

我们先算出每个状态的每种组合情况的和

f[x,y]表示初始状态选取状况为x,最终状态选取状况为y的时候,最多划分成的对数

然后方便转移,我们可以采用记忆化搜索的方式

这道题题解不大好表达,只可意会不可言传

 var w,f:array[..,..] of longint;
    sum,a,b,c:array[..] of longint;
    n,m,i,j,s1,s2,s:longint;
function max(a,b:longint):longint;
  begin
    if a>b then exit(a) else exit(b);
  end; function dfs(x,y:longint):longint;
  var i,j,k:longint;
  begin
    if (x=s1) then
    begin
      if y<>s2 then exit(-)
      else exit();
    end;
    if (y=s2) then
    begin
      if s1=x then exit()
      else exit(-);
    end;
    if f[x,y]<>- then exit(f[x,y]);  //记忆化
    for i:= to s1 do
    begin
      if i and x= then
      begin
        k:=sum[i];
        for j:= to c[k] do   //在最终状态中找一个和初始状态的组合和相等的组形成新的一对
          if w[k,j] and y= then
            f[x,y]:=max(f[x,y],dfs(x xor i,y xor w[k,j])+);
      end;
    end;
    exit(f[x,y]);
  end; begin
  read(n);
  for i:= to n do
    read(a[i]);
  read(m);
  for i:= to m do
    read(b[i]);
  s1:= shl n-;
  s2:= shl m-;
  for i:= to s1 do
    for j:= to n- do
      if i and ( shl j)> then
        sum[i]:=sum[i]+a[j+];
  for i:= to s2 do
  begin
    s:=;
    for j:= to m- do
      if i and ( shl j)> then
        s:=s+b[j+];
    inc(c[s]);   //感觉这种做法很像Meet in middle
    w[s,c[s]]:=i;
  end;
  fillchar(f,sizeof(f),);
  writeln(n+m-*dfs(,));
end.

bzoj2064的更多相关文章

  1. 【BZOJ2064】分裂 状压DP

    [BZOJ2064]分裂 Description 背景:和久必分,分久必和...题目描述:中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力.同时经常搞OI的他把这个变成了一个 ...

  2. bzoj2064[和谐社会模拟赛]分裂

    题意:给定一个初始集合和目标集合,有两种操作:1.合并集合中的两个元素,新元素为两个元素之和 2.分裂集合中的一个元素,得到的两个新元素之和等于原先的元素.要求用最小步数使初始集合变为目标集合,求最小 ...

  3. BZOJ2064: 分裂

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

  4. 【状压dp】Bzoj2064 分裂

    Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中 ...

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

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

  6. 分裂 BZOJ2064 状压DP

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

  7. BZOJ2064:分裂——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2064 Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数 ...

  8. bzoj2064: 分裂(集合DP)

    ......咸鱼了将近一个月,因为沉迷ingress作业越来越多一直没时间搞OI呜呜呜 题目大意:有一个初始集合(n个元素)和一个目标集合(m个元素)(1<=n,m<=10),两个操作   ...

  9. 【bzoj2064】分裂【压状dp】

    Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中 ...

随机推荐

  1. jquery 关于event.target使用的几点说明介绍

    event.target说明:引发事件的DOM元素. this和event.target的区别js中事件是会冒泡的,所以this是可以变化的,但event.target不会变化,它永远是直接接受事件的 ...

  2. Android 点击事件,4种回调。

    1.  继承监听接口. 2.  xml方式 : 设置 android:onClick 3. 内部类 4. 匿名类 ------------------------------------------- ...

  3. SQL2008安装提示"Microsoft visual studio 2008早期之前的版本"解决(这是我认为最简单有效的方法)

    作者:冰封 日期:2013-10-18 原文地址:http://www.skywj.com/thread-9230-1-1.html 在安装SQL Server的时候提示 Microsoft visu ...

  4. [Twisted] 事件驱动模型

    在事件驱动编程中,多个任务交替执行,并且在单一线程控制下进行.当执行I/O或者其他耗时操作时,回调函数会被注册到事件循环. 当I/O完成时,执行回调.回调函数描述了在事件完成之后,如何处理事件.事件循 ...

  5. java动态绑定的情况分析

    java是面向对象的语言,java中多态的一种情况是动态绑定.所谓的动态绑定,分两种情况:当调用类方法的时候,java虚拟机会基于对象的引用类型来选择执行方法.当java调用一个实例方法的时候,他会根 ...

  6. Cocos2dx开发(4)——Windows环境创建Cocod2dx 3.2第一个项目HelloWorld

    本文内容:cocos2dx+VS2013环境下创建项目,部分代码简析.会的朋友可以略过. 前面简单安装了几个环境,程序完全可以顺利跑起来(其他的cocos-stadio这些需要用到再装) 1.命令行形 ...

  7. 用frame实现最基本的上中下三层布局,中间又分左右两部分.

    用frame实现最基本的上中下三层布局,中间又分左右两部分. 用frame的好处在于不用象DIV一样要对浮动和大小进行精确控制,以及要考虑宽屏的时候怎么办.而且在导航的时候非常简单.比如说,左边是导航 ...

  8. sublime text3-代码片段配置

    1.Tools->New Snippet-> <snippet>     <content><![CDATA[${1:public }function ${2 ...

  9. iPhone分辨率

    分辨率和像素 1.iPhone5           4"     分辨率320x568,像素640x1136,@2x 2.iPhone6           4.7"  分辨率3 ...

  10. Junit4 架构设计系列(1): Request,ClassRequest 和 RunnerBuilder

    Overall Junit的成功已不言而喻,其广泛应用于单元测试,测试驱动开发领域.大量的工具,IDE都集成了JUnit,著名的有Maven,Ant,Eclipse,甚至像Google SDK提供的A ...