有n个物品,每个物品有m个特征。随机选择一个物品让你去猜,你每次可以询问一个特征的答案,问在采取最优策略时,最坏情况下需要猜的次数是多少。

设siz[S]为满足特征性质集合S的特征的物品总数,dp[S]为当前得到的物品特征信息为S的情况下最坏情况下需要猜多少次,则$dp[S]=max\{dp(S|(1<<(2*i))),dp(S|(2<<(2*i))\}$(为了表示某个特征不确定的状态,需要将集合大小加倍)。dfs预处理siz的复杂度为$O(n*2^m)$,dp的复杂度为$O(m*3^m)$。

这道题我一开始总是迷之TLE,加了很多优化都失败了,后来好不容易才发现原来是memset花的时间太长了,于是把vis数组的值换成了Case的值,这样就可以避免每次都初始化了。然后时间从TLE直降到90ms,巨无语。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll N=11,inf=0x3f3f3f3f;
 5 int siz[(1<<(N*2))+10],d[(1<<(N*2))+10],n,k,vis[(1<<(N*2))+10],ka;
 6 char s[100+10][N+5];
 7 int dp(int S) {
 8     if(siz[S]==0)return 0;
 9     if(siz[S]==1)return 0;
10     if(siz[S]==2)return 1;
11     int& ret=d[S];
12     if(vis[S]==ka)return ret;
13     vis[S]=ka;
14     ret=inf;
15     for(int i=0; i<n; ++i)if((S>>(2*i)&3)==0)ret=min(ret,max(dp(S|(1<<(2*i))),dp(S|(2<<(2*i)))));
16     return ++ret;
17 }
18
19 void dfs(char* s,int u,int S) {
20     if(u==n) {siz[S]++; return;}
21     dfs(s,u+1,S);
22     if(s[u]=='0')dfs(s,u+1,S|(1<<(u*2)));
23     else if(s[u]=='1')dfs(s,u+1,S|(2<<(u*2)));
24 }
25
26 int main() {
27     memset(vis,0,sizeof vis);
28     while(scanf("%d%d",&n,&k)&&n) {
29         ++ka;
30         memset(siz,0,sizeof siz);
31         for(int i=0; i<k; ++i)scanf("%s",s[i]);
32         for(int i=0; i<k; ++i)dfs(s[i],0,0);
33         printf("%d\n",dp(0));
34     }
35     return 0;
36 }

转载于:https://www.cnblogs.com/asdfsag/p/10381301.html

UVA - 1252 Twenty Questions (状压dp+vis数组加速)相关推荐

  1. uva 1252——Twenty Questions

    题意:给定n个物品,每个物品用01串表示,表示具备与否某个特征,然后每次可以询问一个特征,问最少询问几次能够确定一个物品. 思路:状压Dp,将这些数的特征压缩成一个数,把询问过的和没询问的都用一集合表 ...

  2. nyoj1273 河南省第九届省赛_宣传墙、状压DP+矩阵幂加速

    宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...

  3. 线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

    状压与矩阵加速的藕断丝连 Quad Tiling description solution code [Hnoi2010]Bus 公交线路 description solution code Quad ...

  4. UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 有n个长度为m的二进制串,每个都是不同的. 为了把所有字符串区分开,你可以询问,每次可 ...

  5. UVA 1633 Dyslexic Gollum (状压dp)

    分析:dp[i][j]表示当前为i长度,长度为k的后缀状态,有多少个串.考虑一下k和k+1长度的串是否为回文串即可 代码: #include <iostream> #include < ...

  6. Tunnels HDU - 4856 (bfs状压dp)

    Tunnels HDU - 4856 Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his ...

  7. 状压DP UVA 10817 Headmaster's Headache

    题目传送门 1 /* 2 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 3 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][ ...

  8. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

  9. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

最新文章

  1. 为什么链接库的顺序有时会导致GCC错误?
  2. golang exec.Command 执行命令 返回详细错误信息
  3. 我对Java Serializable(序列化)的理解和总结
  4. Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
  5. 通过快速Java和文件序列化加快速度
  6. 22-随机抽样一致算法RANSAC
  7. linux s删除第一行,Linux文本处理三驾马车之一sed
  8. CentOS 6.2 虚拟机 mail邮件信息: crash:[abrt] full crash report
  9. c语言求一个数的阶乘值代码,求10000的阶乘(c语言代码实现)
  10. snapmix与Bi-Tempered Logistic Loss(自制数据集纯度不高效果好)
  11. 计算机网络连接图标 红叉,win7系统网络连接成功但图标显示红叉的解决方法
  12. 怎么查看自己java程序的源码
  13. 淘宝有什么方法可以一键下载淘宝评论免费的
  14. GreenSock (TweenMax) 极简入门指南
  15. 计算机专业数学建模结课论文,大学生数学建模论文范文
  16. 大津算法 matlab,大津法---OTSU算法
  17. SQLITE3 使用总结
  18. pgsql timestamp without time zone > character varying解决方案
  19. vue3知识点:Suspense组件
  20. NVIDIA发布移动超级计算机“Jetson TK1”性能超树莓派

热门文章

  1. HDU2049 不容易系列之(4)——考新郎
  2. 常用深度学习模型介绍(1)
  3. 如何在asp.net页面使用css和js
  4. Nav- buttons和$ionicView
  5. 纯CSS3实现宽屏二级下拉菜单
  6. 用Java模拟multipart形式的Http Post请求
  7. 给我们宿舍做的游戏--snack
  8. 实体类是个什么东西!答金色海洋同学的疑问
  9. 用git发patch
  10. 计算机网络系统中hn是,中南大学计算机网络作业1.pdf