UVA - 1252 Twenty Questions(状态压缩记忆化搜索)

2024-04-20 12:08

本文主要是介绍UVA - 1252 Twenty Questions(状态压缩记忆化搜索),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:UVA - 1252 Twenty Questions

题意

有n(0

思路

从m的数据范围以及题意,很容易可以想到状态压缩,用二进制位来表示集合。
dp(i, j) = c
i表示已经询问过的特征的集合
j表示已经确定我选的物体具有的特征的集合
那么显然的,j一定是i的子集。
c表示当前状态还需询问的次数

dp(i, j) = 1 + min(max(dp(i|(1<<k), j|(1<<k)),  dp(i|(1<<k), j))) k为所有未询问的特征。

max里的两项分别为,所询问的是我具有的特征 | 所询问的不适我具有的特征。
因为要保证可以百分百确定,所以选择最坏情况中的最好情况。这是为什么用max的原因。
当符合(满足j的所有特征且不满足i除j外的其他特征)的物体小于等于1个时,可以停止询问,因为可以确定结果了。可以对这个计数过程进行预处理,提高效率。
状态重复太多,所以要用到记忆化搜索。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <map>using namespace std;#define LL long longconst int MOD = 1000000007;
const int N = 200;
const int M = 12;
int cnt[1<<M][1<<M];
int p[N];
int dp[1<<M][1<<M];void init(int n, int m)
{for(int s=0; s<(1<<m); s++)for(int i=0; i<n; i++)cnt[s][p[i]&s]++;
}int dfs(int s, int a, int m)
{if(dp[s][a] != 0x3f3f3f3f)return dp[s][a];if(cnt[s][a] <= 1)return 0;for(int i=0; i<m; i++){if(s & (1<<i))continue;dp[s][a] = min(dp[s][a], max(dfs(s|(1<<i),a,m), dfs(s|(1<<i),a|(1<<i),m)));}return dp[s][a]+=1;
}int main()
{int n, m;char t[12];while(~scanf("%d%d", &m, &n) && m && n){memset(cnt, 0, sizeof(cnt));memset(dp, 0x3f, sizeof(dp));for(int i=0; i<n; i++){scanf("%s", t);p[i] = 0;for(int j=0; j<m; j++)if(t[j] == '1')p[i] |= 1<<j;}init(n, m);printf("%d\n", dfs(0, 0, m));}
}

这篇关于UVA - 1252 Twenty Questions(状态压缩记忆化搜索)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920226

相关文章

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。