UVa 1252 (状压DP + 记忆化搜索) Twenty Questions
题意:
有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]里。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; const int maxm = , maxn = ;
char object[maxn][maxm + ];
int d[<<maxm][<<maxm], cnt[<<maxm][<<maxm], vis[<<maxm][<<maxm];
int m, n, kase = ; int dp(int s, int a)
{
if(cnt[s][a] <= ) return ;
if(cnt[s][a] == ) return ; int& ans = d[s][a];
if(vis[s][a] == kase) return ans;
vis[s][a] = kase; ans = m;
for(int k = ; k < m; ++k)
{
if(!(s&(<<k)))
{
int s2 = s | (<<k), a2 = a | (<<k);
if(cnt[s2][a] >= && cnt[s2][a2] >= )
{
int need = max(dp(s2, a2), dp(s2, a)) + ;
ans = min(ans, need);
}
}
}
return ans;
} int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%d%d", &m, &n) && n)
{
++kase;
for(int i = ; i < n; ++i)
scanf("%s", object[i]);
memset(vis, , sizeof(vis));
memset(cnt, , sizeof(cnt));
for(int i = ; i < n; ++i)
{
int feature = ;
for(int f = ; f < m; ++f)
if(object[i][f] == '') feature |= ( << f);
for(int s = ; s < (<<m); ++s)
cnt[s][s&feature]++;
}
printf("%d\n", dp(, ));
} return ;
}
代码君
UVa 1252 (状压DP + 记忆化搜索) Twenty Questions的更多相关文章
- UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache
题意: 一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师. 每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两 ...
- 状压DP+记忆化搜索 UVA 1252 Twenty Questions
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...
- UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)
题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师.每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老 ...
- [JZOJ5398]:Adore(状压DP+记忆化搜索)
题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...
- loj 1021(状压dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25887 题目大意:给定的一个某进制下的排列,问它的全排列有多少个能 ...
- loj 1018(状压dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25844 思路:首先预处理出点在同一直线上的所有的点集状态(dp[i ...
- UVa 1252 Twenty Questions (状压DP+记忆化搜索)
题意:有n件物品,每件物品有m个特征,可以对特征进行询问,询问的结果是得知某个物体是否含有该特征,要把所有的物品区分出来(n个物品的特征都互不相同), 最小需要多少次询问? 析:我们假设心中想的那个物 ...
- UVA - 10817 Headmaster's Headache (状压dp+记忆化搜索)
题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用. 分析: 1.为让雇佣费尽可能少,雇佣的老师应教他所 ...
- UVa 10599【lis dp,记忆化搜索】
UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...
随机推荐
- Careercup - Facebook面试题 - 5733320654585856
2014-05-02 09:59 题目链接 原题: Group Anagrams input = ["star, astr, car, rac, st"] output = [[& ...
- 想成为真正的代码gg,目标
转眼已而大二了,可是在这上了一个星期的课,感觉生活非常的茫然.当然这与我处在的环境有一定的关系. 处在这样的学校,想努力可是让我心凉的是没有一个老师肯真心带学生,, 学校办的各种事情都很坑,,我不怕自 ...
- ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
引子: 本项目在老电脑上用的是oracle10g,换新电脑装的是oracle11g,但运行项目本没有什么关系,本来说创建个用户,用PLSQL手工导入数据,再改几下配置文件即可跑起来--但实际启动中遇到 ...
- 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇
开篇 系统架构的文章,准备在这段时间好好的梳理和整理一下,然后发布基于AgileEAS.NET平台之上的企业级应用架构实践,结合具体的案例来说明AgileEAS.NET平 台之上如何进行系统的逻辑架构 ...
- linux进程管理之开机启动
下面用自启动apache为例;自启动脚本:/usr/local/apache2/bin:./apachectl start文件位于/etc/rc.d/init.d下,名为apached, 注意要可执行 ...
- Unity3D 与 objective-c 之间数据交互。iOS SDK接口封装Unity3D接口
原地址:http://www.cnblogs.com/qingjoin/p/3638915.html Unity 3D 简单工程的创建.与Xcode 导出到iOS 平台请看这 Unity3D 学习 创 ...
- zabbix3.0 安装方法,一键实现短信、电话、微信、APP 告警
引言 免费开源监控工具 Zabbix 因其强大的监控功能得到各大互联网公司的广泛认可,具体功能不再详细介绍,在之前发布的 Zabbix 2.4.1 安装及微信短信提醒已经做了详细介绍,本篇主要对 Za ...
- OneAPM 技术公开课第二讲:开启性能为王的架构时代
「OneAPM 技术公开课」由应用性能管理第一品牌 OneAPM 发起,内容面向 IT 开发和运维人员.云集技术牛人.知名架构师.实践专家共同探讨技术热点.继北京站第一场火爆上演之后,第二场将于9月1 ...
- Perl 三种时间time,localtime,gmttime
#!/usr/bin/perl use warnings; use diagnostics; use strict; use POSIX; print "time: ", time ...
- C++和pascal之间的通信
// MyFirst.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include "Winsock2.h"#pragm ...