/**
题目: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状态的工程师。的更多相关文章

  1. HDU 6006 Engineer Assignment:状压dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 在Google中,有个n项目,m个专家.第i个项目涉及c[i]个领域,分别为a[i][0 ...

  2. 【HDU 6006】Engineer Assignment(状压DP)

    Problem Description In Google, there are many experts of different areas. For example, MapReduce exp ...

  3. HDU6006:Engineer Assignment(状压DP)

    传送门 题意 给出n个工程,m个工程师,每个工程和工程师需要/拥有若干个技能,询问能够完成的最大工程个数,每个工程师用一次 分析 dp[i][j]表示前i个工程用的工程师集合为j的最大工程个数,那么有 ...

  4. Engineer Assignment(暴力+状压dp)

    题意: n个工程,m个研究员,每个工程需要Ci个领域(X1,X2..Xci)的研究员 ,每个研究员会Di个不同的领域(X1,X2..Xdi),要完成一个工程必须使得分配给这个工程的研究员覆盖了这个工程 ...

  5. Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性

    https://codeforces.com/contest/1140/problem/E 局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字 ...

  6. 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 ...

  7. hdu 6006 Engineer Assignment 状压dp

    Engineer Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. hdu 4649 Professor Tian 反状态压缩+概率DP

    思路:反状态压缩——把数据转换成20位的01来进行运算 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就 ...

  9. HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)

    题意 给定平面直角坐标系内的N(N <= 20)个点,每四个点构成一个正方形可以消去,问最多可以消去几个点. 思路 比赛的时候暴力dfs+O(n^4)枚举写过了--无意间看到有题解用状压DP(这 ...

随机推荐

  1. Servlet拦截静态图片的解决方案

    一.现象 建立一个使用Freemarker的Web Project程序. Product.ftl中的代码为: <!DOCTYPE html PUBLIC "-//W3C//DTDHTM ...

  2. App开发架构指南(谷歌官方文档译文)

    这篇文章面向的是已经掌握app开发基本知识,想知道如何开发健壮app的读者. 注:本指南假设读者对 Android Framework 已经很熟悉.如果你还是app开发的新手,请查看 Getting ...

  3. MMORPG 游戏服务器端设计

    http://www.oschina.net/question/12_22983 这里给出一种宏观把握MMORPG服务器设计的文章,适合入门,读完后对服务器端的设计能有大概的掌握,方便对感兴趣的部分进 ...

  4. 数据库连接dbcp$c3p0

    <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- 这是默认配置信 ...

  5. FIFO、LRU、LFU的含义和原理(转)

    题目:请简要介绍FIFO.LRU.LFU的含义和原理   含义: FIFO:First In First Out,先进先出LRU:Least Recently Used,最近最少使用 LFU:Leas ...

  6. git笔记之安装使用

    git是什么? 简介一下,Git是一个开源的分布式版本号控制系统,用以有效.快速的处理从非常小到非常大的项目版本号管理.Git是眼下世界上最先进的分布式版本号控制系统,没有传说中的之中的一个. Git ...

  7. 04-hibernate注解-一对一双向外键关联

    一对一双向外键 1,主控方的配置同一对一单向外键关联. 2,@OneToOne(mappedBy="card") //被控方 @OneToOne(mappedBy="ca ...

  8. 常见SQL Server导入导出数据的几个工具

    摘自:http://www.cnblogs.com/chenxizhang/archive/2011/06/09/2076542.html 在我们的日常工作中,与数据库打交道的机会越来越多.这一篇文章 ...

  9. ASP.NET MVC 简单的分页思想与实现

    首先我们通过VS创建一个空的基于Razor视图引擎的ASP.NET MVC3 Web应用程序,命名为JohnConnor.Web 对创建过程或Razor不太了解的看官,请移步 ASP.NET MVC ...

  10. 算法(第四版)C#题解——2.1

    算法(第四版)C#题解——2.1   写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csh ...