UVA 1252(p287)----Twenty Questions
2016-03-26 20:03
441 查看
#include<bits/stdc++.h> #define debu using namespace std; const int maxn=150; const int maxm=(1<<11)+50; int n,m; char item[maxn][15]; int d[maxm][maxm]; int cnt[maxm][maxm]; int solve(int s,int a) { if(d[s][a]!=-1) return d[s][a]; if(cnt[s][a]<=1) return 0; int& ans=d[s][a]; ans=m; for(int k=0; k<m; k++) if(!(s&(1<<k))) { int s1=s|(1<<k),a1=a|(1<<k); if(cnt[s1][a1]>=1&&cnt[s1][a]>=1) { int step=max(solve(s1,a1),solve(s1,a))+1; ans=min(ans,step); } } return ans; } void prepare() { memset(d,-1,sizeof(d)); memset(cnt,0,sizeof(cnt)); for(int i=0; i<n; i++) { int feature=0; for(int j=0; j<m; j++) if(item[i][j]=='1') feature|=(1<<j); for(int s=0; s<(1<<m); s++) cnt[s][s&feature]++; } } int main() { #ifdef debug freopen("in.in","r",stdin); #endif // debug while(scanf("%d%d",&m,&n)==2&&m) { for(int i=0; i<n; i++) scanf("%s",item[i]); prepare(); printf("%d\n",solve(0,0)); } return 0; }
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3693
题解:状压动归。s表示已经询问的特征,a表示已确认物体所具备的特征,则d[s][a]=min(d[s][a],max(d[s+{k},a+{k}],d[s+{k}][a])+1)。cnt数组表示询问集合s,其中具备的特征为a的物品数,则cnt[s][a]<=1时不需询问,次数为0。
相关文章推荐
- POJ2524Ubiquitous Religions
- 如何降低Vue.js项目中Webpack打包文件的大小?
- 334. Increasing Triplet Subsequence
- 通过request获得全路径
- 自定义控件基础 requestLayout()和invalidate()区别
- 五、初学servlet之请求Request
- Leetcode Sudoku Solver My Submissions Question
- 开源的OLAP框架druid
- 有多个手势支持时候需要实现UIGuestrueRecoginer方法
- UIBezierPath转换为传统上下文的样式
- UIGestureRecognizer手势有哪些
- CodeForces - 560D Equivalent Strings (DFS)
- Educational Codeforces Round 10 E - Pursuit For Artifacts (强联通缩点 + 回溯)
- serialVersionUID
- UITableView 系列之自定义 UITableViewCell
- Mongo 中间件 pre find 修改query
- 【边做项目边学Android】小白会遇到的问题--This Android SDK requires Android Developer Toolkit version 23.0.0 or above
- APUE之线程(三)
- JAVA的String、StringBuilder和StringBuffer
- UILabel 添加图片