[BZOJ2064]分裂

[BZOJ2064]分裂

试题描述

背景: 和久必分,分久必和。。。 题目描述: 中国历史上上分分和和次数非常多。。通读中国历史的WJMZBMR表示毫无压力。 同时经常搞OI的他把这个变成了一个数学模型。 假设中国的国土总和是不变的。 每个国家都可以用他的国土面积代替, 又两种可能,一种是两个国家合并为1个,那么新国家的面积为两者之和。 一种是一个国家分裂为2个,那么2个新国家的面积之和为原国家的面积。 WJMZBMR现在知道了很遥远的过去中国的状态,又知道了中国现在的状态,想知道至少要几次操作(分裂和合并各算一次操作),能让中国从当时状态到达现在的状态。

输入

第一行一个数n1,表示当时的块数,接下来n1个数分别表示各块的面积。 第二行一个数n2,表示现在的块,接下来n2个数分别表示各块的面积。

输出

一行一个数表示最小次数。

输入示例

1 6
3 1 2 3

输出示例

2

数据规模及约定

对于100%的数据,n1,n2<=10,每个数<=50
对于30%的数据,n1,n2<=6,

题解

设 f(S1, S2) 表示 n1 个数中选择了集合 S1 的数,n2 个数中选择了集合 S2 的数。转移的时候我们枚举 S2 的子集 tS,然后找到和 tS 中元素和相同的 S1 的子集 ttS,那么 f(S1, S2) = min{ f(ttS, tS) + f(S1 ^ ttS, S2 ^ tS) },除此之外,还可以直接把 S1 中所有的数合并起来,然后分裂成 S2 中的数,步数即为 S1 中二进制位数 + S2 中二进制位数 - 2。

至于如何找到“和 tS 中元素和相同的 S1 的子集 ttS”,预处理即可,大力搞一个 vector,令 Set[sum] 存储所有元素和等于 sum 的集合。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <vector>
using namespace std;int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f;
}#define maxn 15
#define maxs 3010
#define maxsum 510
#define oo 2147483647int n1, n2, A1[maxn], A2[maxn];
vector <int> Set[maxsum];
int Sum1[maxs], Sum2[maxs], cbin[maxs];int f[maxs][maxs];
int dp(int S1, int S2) {int& ans = f[S1][S2];if(ans < oo) return ans;if(!cbin[S1] && !cbin[S2]) return ans = 0;if(cbin[S1] == 1 && cbin[S2] == 1) return ans = 0;ans = cbin[S1] + cbin[S2] - 2;for(int tS = S2 - 1 & S2; tS; tS = tS - 1 & S2)for(int i = 0; i < Set[Sum2[tS]].size(); i++) if((S1 | Set[Sum2[tS]][i]) == S1)ans = min(ans, dp(Set[Sum2[tS]][i], tS) + dp(Set[Sum2[tS]][i] ^ S1, tS ^ S2));return ans;
}int main() {n1 = read(); for(int i = 0; i < n1; i++) A1[i] = read();n2 = read(); for(int i = 0; i < n2; i++) A2[i] = read();int all = (1 << n1) - 1;for(int S = 0; S <= all; S++) {int sum = 0; cbin[S] = 0;for(int j = 0; j < n1; j++) if(S >> j & 1) sum += A1[j], cbin[S]++;Set[sum].push_back(S); Sum1[S] = sum;}all = (1 << n2) - 1;for(int S = 0; S <= all; S++) {cbin[S] = 0;for(int j = 0; j < n2; j++) if(S >> j & 1) Sum2[S] += A2[j], cbin[S]++;}for(int S1 = 0; S1 <= (1 << n1) - 1; S1++)for(int S2 = 0; S2 <= all; S2++) f[S1][S2] = oo;printf("%d\n", dp((1 << n1) - 1, all));return 0;
}

 

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6930993.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS3选择器

基本选择器 回顾选择器 通配符选择器元素选择器类选择器ID选择器后代选择器新增基本选择器 子元素选择器相邻兄弟选择器通用兄弟选择器群组选择器 子元素选择器 概念&#xff1a;子元素选择器只能选择某元素的子元素 语法&#xff1a;父元素 > 子元素 &#xff08;Fathe…

eclipse java工程目录_转载:Eclipse下的java工程目录

对新手来讲&#xff0c;一个Java工程内部的多个文件夹经常会让大家困惑。更可恶的是莫名其妙的路径问题&#xff0c;在Eclipse编写Java程序中&#xff0c;出现频率最高的错误很可能就是路径问题。这些问题原因其实都是一个&#xff0c;就是关于Java工程内的文件结构理解不清&am…

作为JBoss AS 7模块运行Drools 5.4.0 Final

Drools 5引入了业务逻辑集成平台&#xff0c;该平台为规则&#xff0c;工作流和事件处理提供了统一的集成平台。 它是从头开始设计的&#xff0c;因此每个方面都是一流的公民&#xff0c;毫不妥协。 Drools 5已分为4个主要子项目&#xff1a; Drools Guvnor&#xff08;BRMS …

postgres 支持的线程数_线程池被打满了怎么处理呢,你是否真的了解线程池?

0、前言线程池&#xff0c;顾名思义就是线程的池子&#xff0c;在每次需要取线程去执行任务的时候&#xff0c;没必要每次都创建新线程执行&#xff0c;线程池就是起着维护线程的作用&#xff0c;当有任务的时候就取出一个线程执行&#xff0c;如果任务执行完成则把线程放回到池…

[树形DP]没有上司的舞会

题目链接 思考 首先本题中的关系是一种树形结构&#xff0c;而且符号最优子结构和无后效性&#xff0c;所以可以进行记忆化搜索。 那么首先要在这颗树中选出一个点作为根节点&#xff0c;按照习惯我们将没有父节点的点作为根节点。 接下来要思考的是 状态&#xff1a; dp[i][0…

网页自适应

1.viewport标签 基本语法&#xff1a; <meta name”viewport” content”widthdevice-width,initial-scale1” /> 上面这行代码的意思是&#xff0c;面积的100%&#xff0c;网页宽度默认等于屏幕宽度&#xff08;widthdevice-width&#xff09;, 原始缩放比例&#x…

java 大数处理

头文件&#xff1a;import java.util.*;import java.math.*; Scanner cin Scanner (System.in);//读入while(cin.hasNext())//等价于!EOFncin.nextInt();//读入一个int型的数ncin.nextBigInteger();//读入一个大整数 输出&#xff1a; System.out.print(n);//打印nSystem.out.…

java provider_Java SPI(Service Provider Interface)

//ServiceLoader实现了Iterable接口&#xff0c;可以遍历所有的服务实现者public final class ServiceLoaderimplements Iterable{//查找配置文件的目录private static final String PREFIX "META-INF/services/";//表示要被加载的服务的类或接口private final Clas…

带有自定义注释的Java注释教程

Java注释提供有关代码的信息&#xff0c;并且它们对所注释的代码没有直接影响。 在本教程中&#xff0c;我们将学习Java注释&#xff0c;如何编写自定义注释 &#xff0c;注释用法以及如何使用反射来解析注释 。 注释是在Java 1.5中引入的&#xff0c;现在它已在Hibernate&…

mybatis通用mapper_全网最全Mapper解析,附实操代码帮你更好理解

今天给大家介绍一位老朋友当你第一次接触Java开发的时候&#xff0c;这个老朋友就和你形影不离&#xff0c;当你要进行ORM的时候&#xff0c;单表的增删改查&#xff0c;这位老朋友给了你极大的帮助&#xff0c;不知道你想到他了吗&#xff1f;对&#xff0c;这就是通用mapper&…

初尝微信小程序2-基本框架

基本框架&#xff1a; .wxml &#xff1a;页面骨架 .wxss &#xff1a;页面样式 .js &#xff1a;页面逻辑 描述一些行为 .json &#xff1a;页面配置 创建一个小程序之后&#xff0c;app.js,app.json,app.wxss是必须的&#xff0c;而且名字也不能随意更改&#xff0c;…

JSP内置对象,动作,指令总结

总的来说关于JSP界面有九大内置对象,7大动作,三大指令,现在博主就将这些粘贴出来,此文是很久前整理的学习笔记,如有雷同请谅解! jsp九大内置对象:1>out 向客户端输出数据,字节流.如out.print(" dgaweyr"); 2>request 接收客户端的http请求.String getParameter…

洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

P1795 无穷的序列_NOI导刊2010提高&#xff08;05&#xff09; 题目描述 有一个无穷序列如下&#xff1a; 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式&#xff1a;第一行一个正整数N&#xff0c;表示询问次数&#xff1b; 接下来的…

java 取字符串中的数字_java截取字符串中的数字

随便给你一个含有数字的字符串&#xff0c;比如&#xff1a;String s"eert343dfg56756dtry66fggg89dfgf";那我们如何把其中的数字提取出来呢&#xff1f;大致有以下几种方法&#xff0c;正则表达式&#xff0c;集合类&#xff0c;还有就是String类提供的方法。1 Stri…

番石榴的对象类:Equals,HashCode和ToString

如果您有幸使用JDK 7 &#xff0c;那么新的可用Objects类 &#xff08; 至少对我来说 &#xff09;是实现“通用” Java对象方法&#xff08;例如equals&#xff08;Object&#xff09; [with Objects.equals&#xff08;Object&#xff0c;Object &#xff09; ]&#xff0c; …

此服务器的时钟与主域控制器的时钟不一致_中移动“超高精度时间同步服务器”开标,两家中标...

8月25日&#xff0c;中国移动发布《2020年至2022年同步网设备集中采购_中标候选人公示》公告。两家中标。同步网技术比较小众&#xff0c;但是同步网是5G承载网的重要一环&#xff0c;分享一下&#xff0c;供大家参考。中标情况 标包1-时钟同步设备中标候选人依次排序为&#x…

java 异常管理员_GitHub - kangZan/JCatch: Exception异常管理平台,支持Java、PHP、Python等多种语言...

什么是JCatch当程序发生异常(Exception)&#xff0c;处理方式一般是通过日志文件记录下来&#xff0c;这种方式很容易被忽略&#xff0c;而且查询起来比较麻烦。JCatch提供了一种方案&#xff0c;当程序发生异常时&#xff0c;通过JCatch平台接口提交到JCatch平台&#xff0c;由…

oled

gnd、vcc、clk、miso、rst、mosi、cs 转载于:https://www.cnblogs.com/scrazy/p/7892733.html

使用html css js实现计算器

使用html css js实现计算器&#xff0c;开启你的计算之旅吧 效果图&#xff1a; 代码如下&#xff0c;复制即可使用&#xff1a; <!DOCTYPE html><html lang"en"> <head> <meta charset"utf-8"> <style> /* 主体 */ .co…

面向对象的三个基本特征

面向对象的三个基本特征是&#xff1a;封装、继承、多态。封装 封装最好理解了。封装是面向对象的特征之一&#xff0c;是对象和类概念的主要特性。封装&#xff0c;也就是把客观事物封装成抽象的类&#xff0c;并且类可以把自己的数据和方法只让可信的类或者对象操作&#xff…