UVA - 1252 Twenty Questions (状压dp+vis数组加速)
有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数组加速)相关推荐
- uva 1252——Twenty Questions
题意:给定n个物品,每个物品用01串表示,表示具备与否某个特征,然后每次可以询问一个特征,问最少询问几次能够确定一个物品. 思路:状压Dp,将这些数的特征压缩成一个数,把询问过的和没询问的都用一集合表 ...
- nyoj1273 河南省第九届省赛_宣传墙、状压DP+矩阵幂加速
宣传墙 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...
- 线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路
状压与矩阵加速的藕断丝连 Quad Tiling description solution code [Hnoi2010]Bus 公交线路 description solution code Quad ...
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 有n个长度为m的二进制串,每个都是不同的. 为了把所有字符串区分开,你可以询问,每次可 ...
- UVA 1633 Dyslexic Gollum (状压dp)
分析:dp[i][j]表示当前为i长度,长度为k的后缀状态,有多少个串.考虑一下k和k+1长度的串是否为回文串即可 代码: #include <iostream> #include < ...
- Tunnels HDU - 4856 (bfs状压dp)
Tunnels HDU - 4856 Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his ...
- 状压DP UVA 10817 Headmaster's Headache
题目传送门 1 /* 2 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 3 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][ ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
最新文章
- 为什么链接库的顺序有时会导致GCC错误?
- golang exec.Command 执行命令 返回详细错误信息
- 我对Java Serializable(序列化)的理解和总结
- Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
- 通过快速Java和文件序列化加快速度
- 22-随机抽样一致算法RANSAC
- linux s删除第一行,Linux文本处理三驾马车之一sed
- CentOS 6.2 虚拟机 mail邮件信息: crash:[abrt] full crash report
- c语言求一个数的阶乘值代码,求10000的阶乘(c语言代码实现)
- snapmix与Bi-Tempered Logistic Loss(自制数据集纯度不高效果好)
- 计算机网络连接图标 红叉,win7系统网络连接成功但图标显示红叉的解决方法
- 怎么查看自己java程序的源码
- 淘宝有什么方法可以一键下载淘宝评论免费的
- GreenSock (TweenMax) 极简入门指南
- 计算机专业数学建模结课论文,大学生数学建模论文范文
- 大津算法 matlab,大津法---OTSU算法
- SQLITE3 使用总结
- pgsql timestamp without time zone > character varying解决方案
- vue3知识点:Suspense组件
- NVIDIA发布移动超级计算机“Jetson TK1”性能超树莓派