比赛 NOIP2008集训模拟5 评测结果 AAAAAWAAAA
题目名称 疾病管理 最终得分 90
用户昵称 zqzas 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2008-11-14 11:23:43
显示代码纯文本
#include <iostream>

#define MAXN 1010
#define MAXD 33000

using namespace std;


const int tot=32767;
short n,d,k,ans,f[MAXN][MAXD];
int data[MAXN],many[MAXD];

void getMany()
{
	int k,i,now=0;
	for (k=0;k<=tot;k++)
	{
        now=0;
  	    for (i=0;i<15;i++)
		    if ( (k & (1<<i))==(1<<i))
			   now++;
	    many[k]=now;
    }
}


void run()
{
	int i,j;
	getMany();
	if (many[data[n]]<=k)
	{
		f[n][data[n]]=1;
	}
	for (i=n-1;i>=1;i--)
	{
		for (j=0;j<=tot;j++)
		{
			if (many[j]<=k)
			{
				f[i][j]=f[i+1][j];
				if (many[j | data[i]]<=k && f[i+1][j|data[i]]+1>f[i][j])
				{
					f[i][j]=f[i+1][j|data[i]]+1;
				}
			}
		}
	}
	ans=0;
	for (j=0;j<=tot;j++)
	    if (many[j]<=k)
	       if (f[1][j]>ans)
	          ans=f[1][j];
}

void ini()
{
	int i,j,p,a;
//	scanf("%d%d%d",&n,&d,&k);
	cin>>n>>d>>k;
	for (i=1;i<=n;i++)
	{
		scanf("%d",&p);
		for (j=1;j<=p;j++)
		{
			scanf("%d",&a);
			a--;
			data[i]+=1<<a;
		}
	}
}

int main()
{
	freopen("disease.in","r",stdin);
	freopen("disease.out","w",stdout);
	ini();
	run();
	printf("%d",ans);
	return 0;
}