Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

近期,农场出现了D (1<= D <=15)种细菌。John 要从他的 N (1<= N <=1,000)头奶牛中尽可能多地选些产奶。但是如果选中的奶牛携带了超过 K (1<= K <=D)种不同细菌,所

生产的奶就不合格。请你帮助John 计算出最多可以选择多少头奶牛。

【输入格式】

<第一行:三个整数 N, D, K

下面N行:第i行表示一头牛所携带的细菌情况。第一个整数 di 表示这头牛所携带的细菌种类数,后面di个整数表示这些细菌的各自种类标号。

【输出格式】

只一个数 M,最大可选奶牛数。

样例解释:

选择:

1,2,3,5,6

只有1#和2#两种细菌

Sample Input

6 3 2

0

1 1

1 2

1 3

2 2 1

2 2 1

Sample Output

5

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t045

【题意】

【题解】



设f[i][j]表示前i头牛,细菌的情况为j的选奶牛个数

如果选了第i头牛;

则状态变为j|a[i]

这里a[i]是第i头牛带细菌的情况转化为对应的二进制(有第i种细菌,对应的二进制位上的数字就为1->然后转成十进制);

然后预处理一下0..32768里面哪些状态的细菌个数是小于等于k的;

看看j|a[i]是不是细菌个数小于k;

然后进行转移就好;

f[i][j|a[i]]=max(f[i][j|a[i]],f[i-1][j]+1);//选第i头牛

f[i][j]=max(f[i][j],f[i-1][j]); //不选第i头牛

我都比较喜欢直观的顺推的。



【完整代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. using namespace std;
  5. #define lson l,m,rt<<1
  6. #define rson m+1,r,rt<<1|1
  7. #define LL long long
  8. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  9. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  10. #define mp make_pair
  11. #define pb push_back
  12. #define fi first
  13. #define se second
  14. #define rei(x) scanf("%d",&x)
  15. #define rel(x) scanf("%lld",&x)
  16. #define ref(x) scanf("%lf",&x)
  17. typedef pair<int, int> pii;
  18. typedef pair<LL, LL> pll;
  19. const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
  20. const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
  21. const double pi = acos(-1.0);
  22. const int N = 1100;
  23. int f[2][32768 + 100],a[N];
  24. int n, d, k,now,ans;
  25. bool can[32768 + 100];
  26. void in()
  27. {
  28. rei(n), rei(d), rei(k);
  29. rep1(i, 1, n)
  30. {
  31. int num;
  32. rei(num);
  33. rep1(j, 1, num)
  34. {
  35. int x;
  36. rei(x);
  37. a[i] |= 1 << (x-1);
  38. }
  39. }
  40. }
  41. void pre()
  42. {
  43. rep1(i, 0, 32768)
  44. {
  45. int x = i, cnt = 0;
  46. bool ju = true;
  47. while (x)
  48. {
  49. cnt += x & 1;
  50. x >>= 1;
  51. if (cnt > k)
  52. {
  53. ju = false;
  54. break;
  55. }
  56. }
  57. can[i] = ju;
  58. }
  59. }
  60. void do_dp()
  61. {
  62. now = 0;
  63. memset(f[now], 255, sizeof f[now]);
  64. f[now][0] = 0;
  65. rep1(i, 1, n)
  66. {
  67. now ^= 1;
  68. rep1(j, 0, 32768)
  69. f[now][j] = -1;
  70. rep1(j, 0, 32768)
  71. if (f[now ^ 1][j] != -1)
  72. {
  73. int k = j|a[i];
  74. if (can[k])
  75. f[now][k] = max(f[now][k], f[now ^ 1][j] + 1);
  76. f[now][j] = max(f[now][j], f[now ^ 1][j]);
  77. }
  78. }
  79. rep1(i, 0, 32768)
  80. ans = max(ans, f[now][i]);
  81. }
  82. void o()
  83. {
  84. printf("%d\n", ans);
  85. }
  86. int main()
  87. {
  88. //printf("%d\n", sizeof(f) / 1024 / 1024);
  89. //freopen("F:\\rush.txt", "r", stdin);
  90. in();
  91. pre();
  92. do_dp();
  93. o();
  94. //printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
  95. return 0;
  96. }

【t045】细菌的更多相关文章

  1. OpenJudge计算概论-细菌的战争

    /*====================================================================== 细菌的战争 总时间限制: 1000ms 内存限制: 6 ...

  2. POJ C程序设计进阶 编程题#5:细菌分组实验

    编程题#5:细菌实验分组 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 有 ...

  3. 细菌(disease)

    细菌(disease) 题目描述 近期,农场出现了D(1≤D≤15)种细菌.John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所 ...

  4. 2712:细菌繁殖-poj

    2712:细菌繁殖 总时间限制:  1000ms 内存限制:  65536kB 描述 一种细菌的繁殖速度是每天成倍增长.例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,… ...

  5. 统计细菌基因组ORF

    提取细菌基因组ORF思路: 1.通过FNA文件得到细菌基因组序列 2.分正负链和三个相位共6种情况统计ORF 3.写入文件 转载请保留出处! 统计细菌基因组ORF 贴上Python代码(版本:3.6) ...

  6. 从细菌GFF文件提取CDS序列并转换为氨基酸序列

    最近在上生物信息学原理,打算记录一些课上的作业.第一次作业:如题. 基本思路: 1.从GFF中读取CDS的起始终止位置以及正负链信息.GFF格式见http://blog.sina.com.cn/s/b ...

  7. 【noip模拟赛5】细菌 状压dp

    [noip模拟赛5]细菌   描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...

  8. 【noip模拟赛5】细菌

    描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携带了超过 K (1<=K ...

  9. 细菌多位点序列分型(Multilocus sequence typing,MLST)的原理及分型方法

    摘 要: 多位点序列分型(MLST)是一种基于核酸序列测定的细菌分型方法,通过PCR扩增多个管家基因内部片段,测定其序列,分析菌株的变异,从而进行分型.MLST被广泛应用于病原菌.环境菌和真核生物中. ...

随机推荐

  1. (转)高强度密码管理软件KeePass使用详解

    转自:http://www.ruancan.com/ 算下来,你接触电脑有多久了?从第一次上网,到今天,你一共申请了多少个网站或者软件的帐号?相信这是一个几乎无人能够回答的问题. 无数人面临着这两个问 ...

  2. UML学习总结(3)——StarUML指导手册

    StarUML使用说明-指导手册 原著:Stephen Wong            翻译:火猴 StarUML是一种生成类图和其他类型的统一建模语言(UML)图表的工具.这是一个用Java语言描述 ...

  3. 硬件——STM32 , 录音

    战舰V3的录音程序解析 上一章,我们实现了一个简单的音乐播放器,本章我们将在上一章的基础上,实现一个简单的录音机,实现WAV录音.本章分为如下几个部: 50.1 WAV简介 50.2 硬件设计 50. ...

  4. FastSocket学习笔记~RPC的思想,面向对象的灵活

    首先非常感谢这位来自新浪的老兄,它开发的这个FastSocket非常不错,先不说性能如何,单说它的使用方式和理念上就很让人赞口,从宏观上看,它更像是一种远程过程的调用RPC,即服务器公开一些命令,供客 ...

  5. static 静态

    摘自:https://blog.csdn.net/Kendiv/article/details/675941 关于static的  ""记忆性"" 我们可以用做 ...

  6. 34、JZ2440上WIFI网卡使用

    :http://wireless.kernel.org在这个网站上的document中有下面说有内容的介绍 1. 准备工作(虚拟机,开发板)及配置内核选择WIFI驱动1.1 选型:确定网卡的VID,P ...

  7. ocx 中使用CImage和CComPtr

    #include <atlimage.h> using namespace ATL;

  8. 【record】11.14..11.20

    balabala

  9. SIP对话、事务详解

    1,SIP对话的建立(图片来自于网络) SIP对话的建立包括invite request,response,ACK.其中response包含临时响应(1XX response)和最终响应(非1XX r ...

  10. [TypeStyle] Style CSS pseudo-classes using TypeStyle with $nest

    TypeStyle is a very thin layer on top of CSS. In this lesson we show how to change styles based on p ...