您的位置:首页 > 产品设计 > UI/UE

uva 1252 Twenty Questions

2016-07-14 13:49 393 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=11;
int cnt[(1<<maxn)][(1<<maxn)],f[(1<<maxn)][(1<<maxn)],vis[(1<<maxn)][(1<<maxn)];
char objects[158][maxn];
int n,m,kase=0;
int dp(int s,int a)
{
if(cnt[s][a]<=1) return 0;
if(cnt[s][a]==2) return 1;
if(vis[s][a]==kase) return f[s][a];
vis[s][a]=kase;
int &ans=f[s][a];
ans=m;
for(int k=0;k<m;k++)
{
if(!(s&(1<<k)))
{
int s2=s|(1<<k),a2=a|(1<<k);
if(cnt[s2][a]>=1&&cnt[s2][a2]>=1){
int need=max(dp(s2,a2),dp(s2,a))+1;
ans=min(ans,need);
}
}
}
return ans;
}
void intil()
{
for(int s=0;s<(1<<m);s++){
for(int a=s;a;a=(a-1)&s)
cnt[s][a]=0;
cnt[s][0]=0;
}
for(int i=0;i<n;i++)
{
int features=0;
for(int f=0;f<m;f++) if(objects[i][f]=='1') features|=(1<<f);
for(int s=0;s<(1<<m);s++)
cnt[s][s&features]++;
}
}
int main()
{
memset(vis,0,sizeof(vis));
while(scanf("%d%d",&m,&n)&&(m||n))
{
++kase;
for(int i=0;i<n;i++) scanf("%s",objects[i]);
intil();
printf("%d\n",dp(0,0));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: