HDU6006:Engineer Assignment(状压DP)
传送门
题意
给出n个工程,m个工程师,每个工程和工程师需要/拥有若干个技能,询问能够完成的最大工程个数,每个工程师用一次
分析
dp[i][j]表示前i个工程用的工程师集合为j的最大工程个数,那么有dp[i][j]=max(dp[i-1][j],dp[i-1][j^x]+1),用way[i]记录第i个工程可行的方案,然后转移就行了
trick
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
int dp[11][1111];
vector<int>a[11];
int numa[11];
int numb[11];
vector<int>b[11];
vector<int>way[11];
int t;
int n,m;
int vis[101];
int main()
{
scanf("%d",&t);
F(qq,1,t)
{
scanf("%d %d",&n,&m);
int x;
F(i,1,n)
{
a[i].clear();
way[i].clear();
scanf("%d",numa+i);
F(j,1,numa[i]) {scanf("%d",&x);a[i].push_back(x);}
}
F(i,1,m)
{
b[i].clear();
scanf("%d",numb+i);
F(j,1,numb[i]) { scanf("%d",&x);b[i].push_back(x); }
}
int flag;
mem(dp,0);
R(i,1,(1<<m))
{
mem(vis,0);
flag=1;
for(int j=1;j<=m;++j) if(i&(1<<(j-1)))
{
for(int k=0;k<numb[j];++k) vis[b[j][k]]=1;
}
for(int j=1;j<=n;++j)
{
flag=1;
for(int k=0;k<numa[j];++k) if(vis[a[j][k]]==0){ flag=0;break; }
if(flag) {way[j].push_back(i);dp[j][i]=1;}
}
}
F(i,1,n)R(j,1,(1<<m))
{
dp[i][j]=max(dp[i][j],dp[i-1][j]);
int sz=way[i].size();
R(k,0,sz)
{
x=way[i][k];
if((x&j)==x) dp[i][j]=max(dp[i][j],dp[i-1][j^x]+1);
}
}
int ans=0;
R(i,0,(1<<m)) ans=max(ans,dp[n][i]);
printf("Case #%d: %d\n",qq,ans);
}
return 0;
}
HDU6006:Engineer Assignment(状压DP)的更多相关文章
- hdu 6006 Engineer Assignment 状压dp
Engineer Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU - 6006 Engineer Assignment (状压dfs)
题意:n个工作,m个人完成,每个工作有ci个阶段,一个人只能选择一种工作完成,可以不选,且只能完成该工作中与自身标号相同的工作阶段,问最多能完成几种工作. 分析: 1.如果一个工作中的某个工作阶段没有 ...
- Engineer Assignment HDU - 6006 状压dp
http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...
- HITOJ 2662 Pieces Assignment(状压DP)
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- 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个工程,每个需要某 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
随机推荐
- Continuous Integration with Selenium
I have seen a lot of queries from people who basically want to know how to blend Selenium, Maven, an ...
- ffmpeg编码常见问题排查方法
播放问题排查: 一旦我们遇到视频播放不了,第一件事,就是要找几个别的播放器也播放看看,做一下对比测试,或者对码流做一些基础分析,以便更好的定位问题的源头,而各个平台比较常见的播放/分析工具有如下几个: ...
- python的id()函数的一个小方面(转载)
>>> a = 2 >>> b = 2 >>> id(a) 21132060 >>> id(b) 21132060 >&g ...
- 利用crtmpserver搭建rtmp服务器
Google + 实践:最终直播成功. 记录一下. 这样.兴许就能够对代码进行改造,利用开源码实现:Android平台下.搭建rtmpserver.浏览器端利用flash播放视频. 代码架构为:ffm ...
- 【BZOJ1085】[SCOI2005]骑士精神 双向BFS
[BZOJ1085][SCOI2005]骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它 ...
- 图片转base64存储
图片转base64存储 base64.b64encode(r.content) url='http://www.heze.cn/info/themes/heze/Public/tel/?tel=MDU ...
- Gradle sync failed: Connection timed out: connect
打开AS的project试图,找到gradle目录下的wrapper下面的gradle wrapper.properities找到: distributionUrl=https\://services ...
- STL版 括号匹配(感觉不如之前自己用数组模拟的跑的快)
数据结构实验之栈四:括号匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的 ...
- HDU3480 Division —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-3480 Division Time Limit: 10000/5000 MS (Java/Others) Memory ...
- Redis使用经验之谈
应用场景 保存用户喜欢的商品信息. 类型: Hash, key: usr:${type_id}:${version_id}:${user_id}:${warehouse_id}, field: ${s ...