博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1688[Usaco2005 Open]Disease Manangement 疾病管理*
阅读量:6502 次
发布时间:2019-06-24

本文共 1035 字,大约阅读时间需要 3 分钟。

题意:

n头牛,d种疾病,每头牛都患一些疾病,现在要求选出最多的牛,使这些牛患病的种类数不超过k。n≤1000,d≤15

题解:

状压dp。f[i][S]表示当前考虑i头牛,患病集合为S,

则f[i][S]=max(f[i+1][S|si]+1,f[i+1][S]),S|si为1的位不超过k且S为1的位不超过k

           =f[i+1][S],S|si为1的位超过k且S为1的位不超过k

可以先对每个状态预处理以下判断它为1的位数是否超过了k。

代码:

1 #include 
2 #include
3 #include
4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define maxn 40000 6 using namespace std; 7 8 inline int read(){ 9 char ch=getchar(); int f=1,x=0;10 while(ch<'0'||ch>'9'){
if(ch=='-')f=-1; ch=getchar();}11 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();12 return f*x;13 }14 int f[2][maxn],n,d,k,a[maxn/20],x,y; bool no[maxn];15 void init(){16 inc(i,0,(1<
k){no[i]=1; break;}20 }21 }22 }23 int main(){24 n=read(); d=read(); k=read(); init();25 inc(i,1,n){
int x=read(); inc(j,1,x){
int y=read(); a[i]|=(1<<(y-1));}}26 x=0; y=1;27 for(int i=n;i>=1;i--){28 inc(j,0,(1<

 

20160816

转载于:https://www.cnblogs.com/YuanZiming/p/5774607.html

你可能感兴趣的文章
docker制作镜像篇(基于容器)
查看>>
山寨c 标准库中的getline 函数
查看>>
shell时间
查看>>
pfSense book之2.4安装指南
查看>>
org.springframework.data.redis 一次连接获取特定key所有k-v(pipeline)
查看>>
[译稿]同步复制提议 2010-09
查看>>
windows 自动化目录大纲(各企业架构不一样,按需选择)
查看>>
我的友情链接
查看>>
【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
查看>>
我的友情链接
查看>>
Java 使用 Redis
查看>>
JPA常用注解
查看>>
Java基础学习总结(1)——equals方法
查看>>
Maven学习总结(6)——Maven与Eclipse整合
查看>>
HTML5:理解head
查看>>
oracle
查看>>
java SpringUtil获取bean
查看>>
Centos6.4最小化安装系统初始化脚本
查看>>
PaaS变厚了
查看>>
赛门铁克开启“容灾即服务”时代
查看>>