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(这 ...
随机推荐
- C# 调用 Web Service 时出现 : 407 Proxy Authentication Required错误的解决办法
// 记得 using System.Net; System.Net.WebProxy myProxy = new System.Net.WebProxy("localhost:9099&q ...
- Python学习之路上的几个经典问题
1.python有三元运算符语法(类似C语言的"?")么? 语法如下: [on_true] if [expression] else [on_false] 如果[expressio ...
- hdu4587 TWO NODES
问一个无向图中去掉任意两点后剩下的连通分量的个数最大值 枚举第一个删去的点,在剩下的子图中求割点 注意,剩下的子图可能不连通,那么就要对每个连通块求割点 计算删去一个点后剩余连通分量个数 left 的 ...
- r与java整合(转)
http://jliblog.com/archives/10 R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要.关于整合,一方面,R中可以创建JAVA对象调用JAVA方 ...
- 接口测试框架开发(三):maven+restAssured+Excel(jxl)+testng+extentreports的接口自动化
1.http://www.cnblogs.com/lin-123/p/7151031.html 2.http://www.cnblogs.com/lin-123/p/7151046.html 3.ht ...
- Less is better than never
很多时候,在正确的做一件事之前,我们总会尝试一些笨办法或者白费一些力气: 很多时候,即使在正确的做一件事,由于这事情并非一日之功,而没有收到立竿见影的效果: 之后,我们的内心便容易动摇,怀疑,甚至想要 ...
- java中的Iterator接口
Iterator接口 Iterator接口也是Java集合框架的成员,但它与Collection系列.Map系列的集合不一样:Collection系列集合.Map系列集合主要用于盛装其他对象,而Ite ...
- 使用Firefly编写简易聊天室
1.创建工程命令行下输入firefly-admin.py createproject chat_rooms(linux在终端输入),<ignore_js_op> firefly会在C盘Us ...
- JavaScript 数组去重并统计重复元素出现的次数
1.方法一 var arr = [1, 2, 3, 1, 2, 4]; function arrayCnt(arr) { var newArr = []; for(var i = 0; i < ...
- 基于Nginx实现一个自己的HTTP模块
/usr/local/nginx/conf/nginx.conf文件例如以下: #worker工作进程的用户及用户组 user weijl; #Nginx worker进程个数 worker_proc ...