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; }
相关文章推荐
- Vue.js入门学习(1)
- iOS 把你的UILabel多彩起来
- guess-number-higher-or-lower
- 简单使用Reveal:分析IOS UI界面
- UIView.clipsToBounds 让子 View 只显示落在父 View 的 Frame 部分
- 基于 CoreText 实现的高性能 UITableView
- 1051. Pop Sequence (25)
- KendoUI模板引擎 - #号语法
- STL之unique()去重函数
- request方法大全
- UILocalNotification在 iOS8中无效问题
- UESTC149 解救小Q(bfs)
- UIButton实现背景拉伸
- iOS登陆界面切换到注册界面并返回的UI设计(简易向)
- Android BlueDroid(三):BlueDroid蓝牙开启过程enable
- Android BlueDroid(二):BlueDroid蓝牙开启过程init
- webKitView的reload和loadRequest的使用机制不同,reload刷新失效
- Android BlueDroid(一):BlueDroid概述
- UEditor 之查询当前编辑区域的状态是源码模式还是可视化模式
- CodeForces 688E-The Values You Can Make