https://vjudge.net/problem/UVA-1252

题意:

有n个物体,m个特征。每个物体用一个m位01串表示,表示每个特征是具备还是不具备。我在心里想一个物体,由你来猜。

你每次可以询问一个特征,然后我会告诉你:我心里的物体是否具备这个特征。当你确定答案之后,就把答案告诉我。如果你采用最优策略,最少需要询问几次就能保证猜到。

思路:

很明显的状压DP,和校长的烦恼那道题目差不多,可以用记忆化搜索。

d[s][a]中的s表示询问的总特征集,a表示所想物体所具备的特征集,因此a一定是s的子集。

 #include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std; const int maxn = << ;
const int INF = 0x3f3f3f3f; string str;
int w[];
int d[maxn][maxn];
int m, n; int dp(int s, int a)
{
int& ans = d[s][a];
if (ans != INF) return ans;
int cnt = ;
for (int i = ; i<n; i++)
//边界条件判断,如果cnt<=1,则说明能判断出来了
if ((w[i] & s) == a) cnt++;
if (cnt <= ){ d[s][a] = ; return ; } for (int i = ; i<m; i++)
{
if (s&( << i))continue;
ans = min(ans, max(dp(s | << i, a | << i), dp(s | << i, a)) + );
}
return ans;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (cin>>m>>n &&n&&m)
{
memset(w, , sizeof(w));
memset(d, INF, sizeof(d));
for (int i = ; i<n; i++)
{
cin >> str;
for (int j = ; str[j]; j++)
if (str[j] == '') w[i] |= ( << j);
}
printf("%d\n", dp(,));
}
}

UVa 1252 20个问题的更多相关文章

  1. UVA 1252 十五 Twenty Questions

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

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

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

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

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

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

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

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

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

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

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

  7. UVA - 1252 Twenty Questions (状压dp+vis数组加速)

    有n个物品,每个物品有m个特征.随机选择一个物品让你去猜,你每次可以询问一个特征的答案,问在采取最优策略时,最坏情况下需要猜的次数是多少. 设siz[S]为满足特征性质集合S的特征的物品总数,dp[S ...

  8. UVA - 1252 Twenty Questions (状压dp)

    状压dp,用s表示已经询问过的特征,a表示W具有的特征. 当满足条件的物体只有一个的时候就不用再猜测了.对于满足条件的物体个数可以预处理出来 转移的时候应该枚举询问的k,因为实际上要猜的物品是不确定的 ...

  9. 【Uva 1252】Twenty Questions

    [Link]: [Description] 给你n个物体,每个物体都有m种属性; (每个物体的属性都能和别的物体的属性区别) 现在,你已知这n个物体; 然后让一个人心里想一个物体 你可以问这个人,这个 ...

随机推荐

  1. 009-spring cloud gateway-过滤器GatewayFilter、GlobalFilter、GatewayFilterChain、作用、生命周期、GatewayFilterFactory内置过滤器

    一.概述 在Spring-Cloud-Gateway之请求处理流程中最终网关是将请求交给过滤器链表进行处理. 核心接口:GatewayFilter,GlobalFilter,GatewayFilter ...

  2. [py]列表生成式-支持条件,多值的拼接

    列表生成式 代码简洁一些 支持多条件, 过滤,或拼接某些值 支持返回多值 是一种生成式 # 生成一个列表 print(list(range(1, 11))) # 生成一个列表x^2 ## 方法1: 返 ...

  3. HTTP权威指南读书笔记

    HTTP权威指南笔记 读书有两种境界,第一种境界是将书读薄,另一种是读厚.本篇文章就是HTTP权威指南的读书笔记,算是读书的第一重境界,将厚书读薄.文章对HTTP的一些关键概念做了比较详细的概述,通读 ...

  4. 第一章SpringBoot入门

    一.简介 SpringBoot来简化Spring应用的开发,约定大于配置,去繁从简,just run就能创建一个独立的产品级别的应用. 背景: j2EE笨重的开发方法,繁多的配置,低下的开发效率,复杂 ...

  5. linuxbash 父进程 子进程

    linux登陆linux,就获得一个bash,之后你的bash就是一个独立的进程,被称为pid的就是,之后你在bash下面执行的任何命令都是由这个bash所衍生的,那些被执行的命令被称为子进程.子进程 ...

  6. 读书--编写高质量代码 改善C#程序的157个建议

    最近读了陆敏技写的一本书<<编写高质量代码  改善C#程序的157个建议>>书写的很好.我还看了他的博客http://www.cnblogs.com/luminji . 前面部 ...

  7. STA分析(一) setup and hold

    timing check可以分为Dynamic Timing Analysis(Post_sim)和Static Timing Analysis STA:可以分析的很全面:仿真速度也很快:可以分析控制 ...

  8. Rpgmakermv(5) MiniLabel插件介绍

    ============================================================================ Introduction ========== ...

  9. linux常用命令:split 命令

    split是linux下常用的分割文件命令.Linux下文件分割可以通过split命令来实现,而用cat进行文件合并.而分割可以指定按行数分割和按大小分割两种模式. 1.命令格式: split [OP ...

  10. python练习题-简单方法判断三个数能否组成三角形

    python简单方法判断三个数能否组成三角形 #encoding=utf-8 import math while True: str=raw_input("please input thre ...