CF482C Game with Strings (状压DP+期望DP)
题目大意:甲和乙玩游戏,甲给出n(n<=50)个等长的字符串(len<=20),然后甲选出其中一个字符串,乙随机询问该字符串某一位的字符(不会重复询问一个位置),求乙能确定该串是哪个字符串的询问次数的期望值
这题不看题解好难想......(感谢zhx和zhx两位大佬的题解)
len很小,考虑状压DP,显然我们要状压询问,要定义两个状态,f[]和num[]
1表示询问,0表示未询问
那么,我们定义f[s]表示询问状态s距离确定一个字符串所需要的期望值。
定义tot是s状态剩余的询问的次数,那么显然因为询问剩余的每一位的概率是相等的
而一个询问并不一定能确定唯一一个字符串,可能是好几个,所以我们要处理这个询问状态能确定几个字符串,即num[s]
而num[s]并不能通过暴力枚举得到,所以我们只能通过枚举它的父集来获取它的状态
我们把字符串两两匹配,定义为s状态不能确定的串(用二进制表示哪些串不能确定),接着我们从大到小枚举状态,每个子集都从它的父集更新,取所有
的并集,其中1的数量即为num
tip1:而如果1的数量为1,该状态仍然可以确定所有的串,所以此时num是0
最后我们得到一个很玄学的方程
最后的f[0]即为答案
tip2:当n==1时,出题人貌似想告诉我们,因为不论问不问都只有一个串,所以不用问也知道是哪个......
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 55
#define maxn (1<<20)+100
#define ll long long
#define dd double
#define seed 13131
using namespace std; int n,m;
char str[][];
dd f[maxn];
ll unidf[maxn];
int num[maxn]; int main()
{
//freopen("aa.in","r",stdin);
scanf("%d",&n);
if(n==) {printf("0.0000000000\n");return ;}
for(int i=;i<n;i++)
scanf("%s",str[i]);
m=strlen(str[]);
for(int i=;i<n;i++)
for(int j=i+;j<n;j++)
{
int pos=;
for(int k=;k<m;k++){
if(str[i][k]==str[j][k])
pos|=(<<k);
}
unidf[pos]|=(1ll<<j)|(1ll<<i);
}
for(int s=(<<m)-;s>=;s--)
{
for(int i=;i<m;i++)
if(!(s&(<<i))) unidf[s]|=unidf[s|(<<i)];
for(int j=;j<n;j++)
if(unidf[s]&(1ll<<j)) num[s]+=;
if(num[s]==) num[s]=;
}
f[(<<m)-]=;
for(int s=(<<m)-;s>=;s--)
{
if(!num[s]) {f[s]=;continue;}
int tot=;
for(int i=;i<m;i++) if(!(s&(<<i)))tot++;
for(int i=;i<m;i++)
{
if(((<<i)&s)) continue;
f[s]+=(f[s|(<<i)]/(dd)tot*(dd)num[s|(<<i)]/(dd)num[s]);
}
f[s]+=1.0;
}
printf("%.10lf\n",max(f[],1.00000000000));
return ;
}
CF482C Game with Strings (状压DP+期望DP)的更多相关文章
- P4547 [THUWC2017]随机二分图(状压,期望DP)
期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...
- [CF697D]Puzzles 树形dp/期望dp
Problem Puzzles 题目大意 给一棵树,dfs时随机等概率选择走子树,求期望时间戳. Solution 一个非常简单的树形dp?期望dp.推导出来转移式就非常简单了. 在经过分析以后,我们 ...
- Codeforces Round #302 (Div. 1) C - Remembering Strings 状压dp
C - Remembering Strings 思路:最关键的一点是字符的个数比串的个数多. 然后就能状压啦. #include<bits/stdc++.h> #define LL lon ...
- [思路题][LOJ2290][THUWC2017]随机二分图:状压DP+期望DP
分析 考虑状压DP,令\(f[sta]\)表示已匹配状态是\(sta\)(\(0\)代表已匹配)时完美匹配的期望数量,显然\(f[0]=1\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...
- BZOJ1076/Luogu2473 奖励关(SCOI2008)状压DP+期望DP
题意:给n(n<=15)种宝物宝物有价值w且每个宝物有一个前置宝物(即你必须先吃过它的所有前置宝物至少一次才能吃该宝物),共有m轮游戏,每一轮会在n种宝物等概率选一个出来,因为宝物价值可正可负你 ...
- Codeforces 544E Remembering Strings 状压dp
题目链接 题意: 给定n个长度均为m的字符串 以下n行给出字符串 以下n*m的矩阵表示把相应的字母改动成其它字母的花费. 问: 对于一个字符串,若它是easy to remembering 当 它存在 ...
- B1076 [SCOI2008]奖励关 状压dp&&期望dp
这个题的n<15,一看就是状压dp.但是状态不是很好想.f[][]存i关的状态j. 这个题另一个关键思想在于倒推,我一开始想的是正推,但是只能记忆化了. 题干: 题目描述 你正在玩你最喜欢的电子 ...
- HDU 4336-Card Collector(状压,概率dp)
题意: 有n种卡片,每包面里面,可能有一张卡片或没有,已知每种卡片在面里出现的概率,求获得n种卡片,需要吃面的包数的期望 分析: n很小,用状压,以前做状压时做过这道题,但概率怎么推的不清楚,现在看来 ...
- 【洛谷3343_BZOJ3925】[ZJOI2015]地震后的幻想乡(状压 DP_期望)
题目: 洛谷 3343 BZOJ 3925 分析: 谁给我说这是个期望概率神题的,明明没太大关系好吧 「提示」里那个结论哪天想起来再问 Jumpmelon 怎么证. 首先,由于开始修路前 \(e_i\ ...
随机推荐
- django迁移数据库报错解决
迁移数据库时提示之前的项目中模型未引入 如图 我在创建新的工程时,迁移数据模型时发现出错,错误提示关联模型未被解决,提示的模型是之前项目中定义的,本项目并没有用到.于是在不知道错误原因下,我重装dja ...
- 搞定PHP面试 - 函数知识点整理
一.函数的定义 1. 函数的命名规则 函数名可以包含字母.数字.下划线,不能以数字开头. function Func_1(){ } //合法 function func1(){ } //合法 func ...
- 【CodeForces 987C】Three displays
[链接] 我是链接,点我呀:) [题意] [题解] 动态规划 设dp[i][j]表示前i个数字,选了j个的最小花费. dp[i][j] = min(dp[k][j-1]+b[i]);//其中a[i]& ...
- Linux下 利用find命令删除所有.svn目录
====================实例============== 删除所有.svn目录 这也是我当初查找 Linux find 命令的目的. 1) find . -type d -name ...
- BA-给排水-供水系统自动控制(转载)
浙江省建筑设计研究院划 杨绍胤 杨庆 摘 要:探讨供水系统变流量和恒压自动控制和设计方法.关键词: 供水系统 自动控制 传统给水系统常在屋顶设置高位水箱.水从地下水箱用水泵打到高位水箱.从高位水箱通过 ...
- stylesheet_link_tag,javascript_include_tag无效?
stylesheet_link_tag,javascript_include_tag无效? http://stackoverflow.com/questions/28241981/rails-4-ex ...
- Scapy介绍官方文档翻译
关于Scapy Scapy为何如此特别 高速的报文设计 一次探測多次解释 Scapy解码而不解释 高速展示Quick demo 合理的默认值 学习Python 本人英文水平有限,翻译不当之处,请參考官 ...
- 朴素贝叶斯python实现
概率论是非常多机器学习算法基础,朴素贝叶斯分类器之所以称为朴素,是由于整个形式化过程中仅仅做最原始.简单的如果. (这个如果:问题中有非常多特征,我们简单如果一个个特征是独立的.该如果称做条件独立性, ...
- centos 下 KVM虚拟机的创建、管理与迁移
kvm虚拟机管理 一.环境 role hostname ip OS kvm_server target 192.168.32.40 ...
- CentOS 7 安装 vmware tools 提示The path "" is not a valid path to the 3.10.0-957.el7.x86_64 kernel headers.
输入“mkdir /mnt/cdrom”在/mnt目录下新建一个名为cdrom的文件夹 mkdir /mnt/cdrom 输入“mount -t iso9660 /dev/cdrom /mnt/cdr ...