[BZOJ 2064]分裂
2064: 分裂
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 572 Solved: 352
[Submit][Status][Discuss]Description
背景: 和久必分,分久必和。。。 题目描述: 中国历史上上分分和和次数非常多。。通读中国历史的WJMZBMR表示毫无压力。 同时经常搞OI的他把这个变成了一个数学模型。 假设中国的国土总和是不变的。 每个国家都可以用他的国土面积代替, 又两种可能,一种是两个国家合并为1个,那么新国家的面积为两者之和。 一种是一个国家分裂为2个,那么2个新国家的面积之和为原国家的面积。 WJMZBMR现在知道了很遥远的过去中国的状态,又知道了中国现在的状态,想知道至少要几次操作(分裂和合并各算一次操作),能让中国从当时状态到达现在的状态。Input
第一行一个数n1,表示当时的块数,接下来n1个数分别表示各块的面积。 第二行一个数n2,表示现在的块,接下来n2个数分别表示各块的面积。Output
一行一个数表示最小次数。Sample Input
1 6
3 1 2 3Sample Output
2
数据范围:
对于100%的数据,n1,n2<=10,每个数<=50
对于30%的数据,n1,n2<=6,HINT
Source
题解
这个题的思路异常地清奇...
首先看到数据范围很容易想到暴搜或者状压DP 2333
然后我们可以想到, 对于一个 $n$ 块的情况要想办法分裂合并为一个 $m$ 块的情况, 我们有保证可以分裂合并完成的策略: 通过 $n-1$ 次合并将面积合并为一整坨, 然后再通过 $m-1$ 次分裂将面积分为目标状态, 总操作数 $n+m-2$ . 然后我们需要想办法优化这个过程.
然后我们发现, 如果初始状态中挑出 $k_0$ 块的面积刚好等于目标状态中的 $k_1$ 块的面积, 我们可以单独让这几块通过 $k_0+k_1-2$ 次操作达到目标状态, 剩余的 $n-k_0$ 块与 $m-k_1$ 块可以通过 $n-k_0+m-k_1-2$ 次分裂合并达到目标状态, 总操作数会变为 $n+m-4$ 次.
也就是说我们如果每找到这样的一组对应关系, 就可以通过分组分裂合并减少 $2$ 次分裂合并的操作. 这样的组越多则所需操作数越少.
所以我们可以定义 $dp_i$ 为 $i$ 所代表的状态中的对应关系数的最大值. 另外再开一个辅助数组记录面积和来判断是否面积相等. 这里可以将目标状态的面积值定义为负, 这样就可以通过求和判断是否为 $0$ 来判定两块的面积是否相等了. 如果相等则说明找到了新一对对应关系(因为状态是唯一的).
至于转移, $dp_i$ 可以从状态 $i$ 任意减少一个元素后的状态转移. 取一下 $max$ 就好.
找到新一组对应关系后给 $dp$ 数组中对应该状态的值 $+1$ 就可以.
转移后得到的最终答案为 $n+m-2dp_{2^{n+m}-1}$ (因为每一对都减少了 $2$ . 整个整体也可以看成一对.)
参考代码
GitHub
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXN=; int n;
int n1,n2;
int size[MAXN];
int dp[<<MAXN];
int sum[<<MAXN]; int main(){
scanf("%d",&n1);
for(int i=;i<n1;i++){
scanf("%d",size+i);
}
scanf("%d",&n2);
for(int i=;i<n2;i++){
scanf("%d",size+n1+i);
size[n1+i]=-size[n1+i];
}
n=n1+n2;
for(int i=;i<(<<n);i++){
for(int j=;j<n;j++){
if((i&(<<j))!=){
dp[i]=std::max(dp[i],dp[i^(<<j)]);
sum[i]+=size[j];
}
}
if(sum[i]==)
dp[i]++;
}
printf("%d\n",n-*dp[(<<n)-]);
return ;
}
Backup
[BZOJ 2064]分裂的更多相关文章
- BZOJ 2064: 分裂( 状压dp )
n1+n2次一定可以满足..然后假如之前土地集合S1的子集subs1和之后土地集合S2的子集subs2相等的话...那么就少了2个+操作...所以最后答案就是n1+n2-少掉的最多操作数, 由状压dp ...
- Bzoj 2064 分裂 题解
2064: 分裂 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 570 Solved: 350[Submit][Status][Discuss] De ...
- BZOJ 2064: 分裂 [DP 状压 转化]
传送门 题意:一开始$n$块面积最后$m$块面积,面积和相等每次可以分裂或者合并,问最少几次 昨天忘发了... 不会.... 考虑最差情况,$n+m-2$所有先合并再分裂 发现只有当前后两个子集相等时 ...
- bzoj 2064: 分裂【状压dp】
参考:https://www.cnblogs.com/liu-runda/p/6019426.html 有点神奇 大概就是显然最直观的转移是全部合起来再一个一个拆,是n+m次,然后设f[i][j]为分 ...
- BZOJ 2064: 分裂 状压动归
最多的操作次数是 $n+m-1$ (相当于把第一个暴力合并,再暴力拆成第二个).如果第一个序列的一个子序列和第二个区间的子序列相等,那么总次数就可以减 $2$.将第二个序列所有数取反,直接求解有多少个 ...
- 2064: 分裂 - BZOJ
Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中 ...
- BZOJ 2064 - 状压DP
传送门 题目大意: 给两个数组, 数组中的两个元素可以合并成两元素之和,每个元素都可以分裂成相应的大小,问从数组1变化到数组2至少需要多少步? 题目分析: 看到数据范围\(n<=10\), 显然 ...
- BZOJ 1188 分裂游戏(sg函数)
如果把每堆巧克力看做一个子游戏,那么子游戏会互相影响. 如果把全部堆看做一个子游戏,那么状态又太多. 如果把每一个单独的巧克力看成一个子游戏的话,那么状态很少又不会互相影响. 令sg[i]表示一个巧克 ...
- bzoj 2064 DP
这道题可以抽象成两个数列,将一个数列变换为另一个 数列的代价最小 首先我们可以处理出所有的状态代表,对于每个状态 用二进制来表示,代表的是两个数列中的每一项选还是不选 那么答案最多为n1+n2-2,也 ...
随机推荐
- 利用Windows性能计数器(PerformanceCounter)监控
一.概述 性能监视,是Windows NT提供的一种系统功能.Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种对象提供了数百个性能计数器.性能对象,就 ...
- 芝麻HTTP:Python爬虫利器之Xpath语法与lxml库的用法
安装 pip install lxml 利用 pip 安装即可 XPath语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历.XPat ...
- jsTree树形菜单分类
这里我演示的jsTree是基于ABP框架 ,展示部分代码,话不多说首先看效果如: 1:引入JS <link href="/jstree/themes/default/style.css ...
- SSH框架之-hibernate 三种状态的转换
一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...
- 如何使用jQuery-ContextMenu实现右击菜单
最近在做项目中,遇到一个棘手的问题,页面上有很多功能需要实现,每个功能需要绑定一个按钮.如果一个功能绑定一个按钮,那么将会占用页面很大的空间,而且可能会使页面变得不美观.思前想后,决定将所有按钮做成右 ...
- winform自动更新程序实现
一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感 ...
- ORA-01940: cannot drop a user that is currently connected解决方法
我们在删除数据库用户时候会碰到如下错误 SQL> DROP USER sys_xj cascade; DROP USER sys_xj cascade*ERROR at line 1:ORA-0 ...
- 【BZOJ4237】稻草人(CDQ分治,单调栈)
[BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的 ...
- Windows下GO的开发环境配置
本文主要内容如下几点: 下载安装GO 配置多个工作区,第一个默认放第三方包,其他的放项目代码 包管理器godep的安装使用 安装过程中的一些坑(墙) vscode中使用go 1. 下载并安装go 官网 ...
- 如何在原生微信小程序中实现数据双向绑定
官网:https://qiu8310.github.io/minapp/ 作者:Mora 在原生小程序开发中,数据流是单向的,无法双向绑定,但是要实现双向绑定的功能还是蛮简单的! 下文要讲的是小程序框 ...