hdu6006 Engineer Assignment 状态dp 定义dp[i][s]表示前i个工程状态为s可以执行的最大工程数。s表示前i个工人选走了s状态的工程师。
/**
题目:hdu6006 Engineer Assignment
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006
题意:已知n个工程,每个需要某些领域的专家。有m个工程师,每个人擅长一些领域。 m<=10
一个工程师只能参加一个工程。一个工程可以多个工程师参加。
如果参加某个工程的工程师他们擅长的领域覆盖了该工程需要的领域。那么该工程可以执行。
问最多可以执行多少个工程。
思路:
定义dp[i][s]表示前i个工程状态为s可以执行的最大工程数。s表示前i个工人选走了s状态的工程师。
dp[i][s] = max(dp[i][s],dp[i-1][s']+1); s'为s的子集,且f[i][s-s'] = 1; 表示i这个工程,分配s-s'的工程师,可以完成。 */ #include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 2e5+;
const int inf = 0x3f3f3f3f;
vector<int> pro[], eng[];
map<int,int> mp;
int f[][<<];
int mv[];
int rm[<<];
int n, m;
int dp[][<<];
void init()
{
mv[] = ;
for(int i = ; i <= m; i++){
int s = ;
for(int j = ; j < eng[i].size(); j++){
s |= <<(mp[eng[i][j]]-);
}
mv[i] = s;
}
int len = (<<m);
rm[] = ;
for(int i = ; i < len; i++){
rm[i] = ;
for(int j = ; j <= m; j++){
if(i&(<<(j-))){
rm[i] |= mv[j];
}
}
} memset(f, , sizeof f);
for(int i = ; i <= n; i++){
int s1 = ;
for(int j = ; j < pro[i].size(); j++){
if(mp[pro[i][j]]==){
s1 = ; break;
}
s1 |= <<(mp[pro[i][j]]-);
}
if(s1==) continue;
for(int j = ; j < len; j++){
if((rm[j]&s1)==s1){
f[i][j] = ;
}
}
}
}
int main()
{
int cas = , T;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
int num, x;
for(int i = ; i <= n; i++){
scanf("%d",&num);
pro[i].clear();
for(int j = ; j <= num; j++){
scanf("%d",&x);
pro[i].push_back(x);
}
} mp.clear();
int cnt = ;
for(int i = ; i <= m; i++){
scanf("%d",&num);
eng[i].clear();
for(int j = ; j <= num; j++){
scanf("%d",&x);
eng[i].push_back(x);
if(mp[x]==){
mp[x] = cnt++;
}
}
}
int len = (<<m);
init();
int now = ;
for(int i= ; i < len; i++) dp[][i] = ;
for(int i = ; i <= n; i++){
now ^= ;
for(int s = ; s < len; s++){
dp[now][s] = dp[now^][s];///根据定义,所以传递。
if(f[i][s]==) continue;
for(int s0 = s; s0; s0 = (s0-)&s){
if(f[i][s0])
dp[now][s] = max(dp[now][s],dp[now^][s-s0]+);
}
}
}
printf("Case #%d: %d\n",cas++,dp[now][len-]);
}
return ;
}
hdu6006 Engineer Assignment 状态dp 定义dp[i][s]表示前i个工程状态为s可以执行的最大工程数。s表示前i个工人选走了s状态的工程师。的更多相关文章
- HDU 6006 Engineer Assignment:状压dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 在Google中,有个n项目,m个专家.第i个项目涉及c[i]个领域,分别为a[i][0 ...
- 【HDU 6006】Engineer Assignment(状压DP)
Problem Description In Google, there are many experts of different areas. For example, MapReduce exp ...
- HDU6006:Engineer Assignment(状压DP)
传送门 题意 给出n个工程,m个工程师,每个工程和工程师需要/拥有若干个技能,询问能够完成的最大工程个数,每个工程师用一次 分析 dp[i][j]表示前i个工程用的工程师集合为j的最大工程个数,那么有 ...
- Engineer Assignment(暴力+状压dp)
题意: n个工程,m个研究员,每个工程需要Ci个领域(X1,X2..Xci)的研究员 ,每个研究员会Di个不同的领域(X1,X2..Xdi),要完成一个工程必须使得分配给这个工程的研究员覆盖了这个工程 ...
- Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性
https://codeforces.com/contest/1140/problem/E 局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字 ...
- Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)
https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...
- hdu 6006 Engineer Assignment 状压dp
Engineer Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4649 Professor Tian 反状态压缩+概率DP
思路:反状态压缩——把数据转换成20位的01来进行运算 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就 ...
- HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)
题意 给定平面直角坐标系内的N(N <= 20)个点,每四个点构成一个正方形可以消去,问最多可以消去几个点. 思路 比赛的时候暴力dfs+O(n^4)枚举写过了--无意间看到有题解用状压DP(这 ...
随机推荐
- Android面试,简要介绍一下asynctask和handler的优缺点
1 )AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以 ...
- YARN Application执行流程
原文见 http://xiguada.org/yarn-application_run/ 本节简单描述了一个Application在YARN上的执行流程,希望对初识YARN的同学提供一些帮助. 图1 ...
- RocketMQ通信协议
我们先从client端看一个消息是如何发送到服务端,服务端又是如何解析消息的. client端: 构造请求体: 构造请求体: 发送消息体: 下面看服务端: rocketmq的协议服务端解析救灾这里了R ...
- 一个tomcat中部署多个项目
在各自的项目web.xml中添加 <context-param> <param-name>webAppRootKey</param-name> <param- ...
- zabbix_zatree第三方插件
1.下载zatree第三方插件https://github.com/spide4k/zatree.git 2.检查PHP环境需要支持php-xml.php-gd.php-mysql 3.先备份当前za ...
- Win7开机提示group policy client无法登陆怎么办
1 开机按F8,进入安全模式 2 进入系统之后运行注册表,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Prof ...
- ffmpeg代码解析
void avdevice_register_all(void){ static int initialized; if (initialized) return; i ...
- 01-hibernate注解:类级别注解准备工作
注解简介: 目的:为了简化繁琐的ORM映射文件(.hbm)的配置. JPA与hibernate的关系 JPA:全称 java Persistence API(java持久化API接口) JPA注解是J ...
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...
- iOS-使用添加的花样字体
代码地址如下:http://www.demodashi.com/demo/11501.html 项目需求中, 有时候有些金额利率等这些不用系统默认字体展现, 而需要着重突出展示! 一.项目截图及效果截 ...