Twenty Questions

https://odzkskevi.qnssl.com/15b7eb4cd1f75f63cee3945b0b845e4f?v=1508411736

【题解】

dp[S1][S2]表示已经询问了S1,确定有S2,还需要至少多少次询问

dp[S1][S2] = max(min(dp[S1 | k][S2 | k], dp[S1 | k, S2 | j)) + 1

即枚举询问哪一个k,得到答复是有/没有中取还需要的询问次数最大的,然后

在所有的k中找最小的,表示到了S1,S2这个状态我要去询问k

预处理cnt[S1][S2]表示S2是S1的子集且属性为S2的物体的个数

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b)) inline void swap(int &a, int &b)
{
int tmp = a;a = b;b = tmp;
} inline void read(int &x)
{
x = ;char ch = getchar(), c = ch;
while(ch < '' || ch > '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
if(c == '-')x = -x;
} const int INF = 0x3f3f3f3f;
const int MAXN = + ;
const int MAXM = + ; int ma,dp[ << MAXM][ << MAXM], cnt[ << MAXM][ << MAXM], n, m, num[MAXN];
char s[MAXM];
/*
dp[s1][s2]表示已经询问了s1,确定有s2,还需要询问多少次
*/
int DP(int s1, int s2)
{
if(cnt[s1][s2] <= )return ;
if(dp[s1][s2] > -)return dp[s1][s2];
dp[s1][s2] = INF;
for(register int i = ;i < m;++ i)
{
if(s1 & ( << i))continue;
dp[s1][s2] = min(dp[s1][s2], max(DP(s1 | ( << i), s2), DP(s1 | ( << i), s2 | ( << i))) + );
}
return dp[s1][s2];
} int main()
{
while(scanf("%d %d", &m, &n) != EOF && m + n)
{
memset(num, , sizeof(num));
memset(dp, -, sizeof(dp));
memset(cnt, , sizeof(cnt));
for(register int i = ;i <= n;++ i)
{
scanf("%s", s);
for(register int j = ;j < m;++ j)
if(s[j] == '') num[i] |= ( << j);
}
ma = << m;
for(register int s1 = ;s1 < ma - ;++ s1)
for(register int i = ;i <= n;++ i)
++ cnt[s1][s1 & num[i]];
printf("%d\n", DP(,));
}
return ;
}

UVA1252

Uva1252 Twenty Questions的更多相关文章

  1. UVA-1252 Twenty Questions (状压DP)

    题目大意:有n件物品,每件物品有m个特征,可以对特征进行询问,询问的结果是得知某个物体是否含有该特征,要把所有的物品区分出来(n个物品的特征都互不相同)最小需要多少次询问? 题目分析:定义dp(s,a ...

  2. UVA 1252 十五 Twenty Questions

    十五 Twenty Questions Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submi ...

  3. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

  4. UVA1252 【Twenty Questions】

    分析 为了叙述方便,设"心里想的物体"为W.首先在读入时把每个物体转化为一个二进制整数.不难发现,同一个特征不需要问两遍,所以可以用一个集合s表示已经询问的特征集. 在这个集合s中 ...

  5. UVa 1252 (状压DP + 记忆化搜索) Twenty Questions

    题意: 有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数. 每次只可以询问该数的第K为是否为1. 问采用最优询问策略,则最少需要询问多少次能保证猜 ...

  6. Twenty Questions

    题意: 有n个长度为m的二进制串,每个都是不同的. 为了把所有字符串区分开,你可以询问,每次可以问某位上是0还是1. 问最少提问次数,可以把所有字符串区分开来. 分析: dp[s1][s2]: 表示提 ...

  7. UVa 1252 Twenty Questions (状压DP+记忆化搜索)

    题意:有n件物品,每件物品有m个特征,可以对特征进行询问,询问的结果是得知某个物体是否含有该特征,要把所有的物品区分出来(n个物品的特征都互不相同), 最小需要多少次询问? 析:我们假设心中想的那个物 ...

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

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

  9. UVa 1252 - Twenty Questions(状压DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. vue2 + koa2全栈部署

    1.首先打包前端上传 修改config下的index.js 代理地址为服务器IP index: path.resolve(__dirname, '../dist/index.html'), asset ...

  2. iOS界面动画特效

    1.TableView的headView背景图片拉伸 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup aft ...

  3. 01_Hibernate持久化

    一.简介 思考:为什么使用Hibernate? Hibernate对JDBC访问数据库的代码进行了封装. Hibernate是一个基于JDBC的主流持久化框架. Hibernate的性能比较好,它是一 ...

  4. python3-常用模块之openpyxl(2)封装

    简单封装了下openpyxl,仅供参考,openpyxl版本2.6.2#操作存在的文件from openpyxl import Workbookfrom openpyxl import load_wo ...

  5. <每日一题>题目15:mysql创建表及相关约束

    题目: 解答: 第一个表创建: create table class( cid int not null auto_increment primary key, caption char(20) no ...

  6. Vuex持久化存储之vuex-persist

    在引入mapMutations时报错,解决方法: 1:npm install --save-dev babel-plugin-transform-object-rest-spread 2:在packa ...

  7. 政务私有云盘系统建设的工具 – Mobox私有云盘

    序言 这几年,智慧政务已经成为了政府行业IT建设发展的重要进程.传统办公方式信息传递速度慢.共享程度低.查询利用难,早已成为政府机关获取和利用信息的严重制约因素.建立文档分享共用机制,加强数据整合,避 ...

  8. python re.sub详解

    re.sub(pattern, repl, string, count=0, flags=0) re.sub的含义,作用,功能就是: 对于输入的一个字符串,利用正则表达式(的强大的字符串处理功能),去 ...

  9. 【python之路46】内置函数2,是【python之路18】的补充

    将3.5版本中的68个内置函数,按顺序逐个进行了自认为详细的解析.为了方便记忆,将这些内置函数进行了如下分类: 数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个 ...

  10. c++ 链接mysql:error LNK2019: 无法解析的外部符号

    使用VS2012编译项目报错如下: error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 _main 中被引用 error LNK2019: 无 ...