博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 1252 (状压DP + 记忆化搜索) Twenty Questions
阅读量:5094 次
发布时间:2019-06-13

本文共 1224 字,大约阅读时间需要 4 分钟。

题意:

有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数。

每次只可以询问该数的第K为是否为1.

问采用最优询问策略,则最少需要询问多少次能保证猜到。

比如有1100 和 0110两个数,只需要询问第一或第三位数是否为1,即可猜中,因此答案为1.

分析:

d(s, a)表示已经询问了的集合s,在已经询问了的集合中W中为1的集合为a,还需要询问多少次。

如果下一次询问第k位,则询问次数为:

  

然后取所有k里的最小值即可。

 

预处理:

对于每个s和a,可以先把满足条件的数的个数记录下来,保存在cnt[s][a]里。

 

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 const int maxm = 12, maxn = 130; 7 char object[maxn][maxm + 10]; 8 int d[1<
<
= 1 && cnt[s2][a2] >= 1)27 {28 int need = max(dp(s2, a2), dp(s2, a)) + 1;29 ans = min(ans, need);30 }31 }32 }33 return ans;34 }35 36 int main()37 {38 //freopen("in.txt", "r", stdin);39 while(scanf("%d%d", &m, &n) && n)40 {41 ++kase;42 for(int i = 0; i < n; ++i)43 scanf("%s", object[i]);44 memset(vis, 0, sizeof(vis));45 memset(cnt, 0, sizeof(cnt));46 for(int i = 0; i < n; ++i)47 {48 int feature = 0;49 for(int f = 0; f < m; ++f)50 if(object[i][f] == '1') feature |= (1 << f);51 for(int s = 0; s < (1<
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4068756.html

你可能感兴趣的文章
[[UIScreen mainScreen] bounds] 返回的屏幕尺寸不对
查看>>
python基础_格式化输出(%用法和format用法)
查看>>
前端面试题之手写事件模型及事件代理/委托
查看>>
python 自动回收机制
查看>>
11月17日站立会议内容
查看>>
后端图片上传
查看>>
Ubantu16.04LTS麒麟版:取消登录界面的"客人回话"
查看>>
ubuntu编译运行xv6
查看>>
POJ 2031 Building a Space Station(三维空间中最小生成树Prim算法)
查看>>
02-Mysql数据库----初识
查看>>
Swift - 环形进度条(UIActivityIndicatorView)的用法
查看>>
android 自定义 radiobutton 文字颜色随选中状态而改变
查看>>
J Press the Button
查看>>
AngularJS简单例子
查看>>
c++ 11 practise -1-
查看>>
Akka-Cluster(0)- 分布式应用开发的一些想法
查看>>
restapi(3)- MongoDBEngine : MongoDB Scala编程工具库
查看>>
逍遥语录
查看>>
回调函数c++类中实现
查看>>
log4j.properties配置
查看>>