题目大意:甲和乙玩游戏,甲给出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)的更多相关文章

  1. P4547 [THUWC2017]随机二分图(状压,期望DP)

    期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...

  2. [CF697D]Puzzles 树形dp/期望dp

    Problem Puzzles 题目大意 给一棵树,dfs时随机等概率选择走子树,求期望时间戳. Solution 一个非常简单的树形dp?期望dp.推导出来转移式就非常简单了. 在经过分析以后,我们 ...

  3. Codeforces Round #302 (Div. 1) C - Remembering Strings 状压dp

    C - Remembering Strings 思路:最关键的一点是字符的个数比串的个数多. 然后就能状压啦. #include<bits/stdc++.h> #define LL lon ...

  4. [思路题][LOJ2290][THUWC2017]随机二分图:状压DP+期望DP

    分析 考虑状压DP,令\(f[sta]\)表示已匹配状态是\(sta\)(\(0\)代表已匹配)时完美匹配的期望数量,显然\(f[0]=1\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...

  5. BZOJ1076/Luogu2473 奖励关(SCOI2008)状压DP+期望DP

    题意:给n(n<=15)种宝物宝物有价值w且每个宝物有一个前置宝物(即你必须先吃过它的所有前置宝物至少一次才能吃该宝物),共有m轮游戏,每一轮会在n种宝物等概率选一个出来,因为宝物价值可正可负你 ...

  6. Codeforces 544E Remembering Strings 状压dp

    题目链接 题意: 给定n个长度均为m的字符串 以下n行给出字符串 以下n*m的矩阵表示把相应的字母改动成其它字母的花费. 问: 对于一个字符串,若它是easy to remembering 当 它存在 ...

  7. B1076 [SCOI2008]奖励关 状压dp&&期望dp

    这个题的n<15,一看就是状压dp.但是状态不是很好想.f[][]存i关的状态j. 这个题另一个关键思想在于倒推,我一开始想的是正推,但是只能记忆化了. 题干: 题目描述 你正在玩你最喜欢的电子 ...

  8. HDU 4336-Card Collector(状压,概率dp)

    题意: 有n种卡片,每包面里面,可能有一张卡片或没有,已知每种卡片在面里出现的概率,求获得n种卡片,需要吃面的包数的期望 分析: n很小,用状压,以前做状压时做过这道题,但概率怎么推的不清楚,现在看来 ...

  9. 【洛谷3343_BZOJ3925】[ZJOI2015]地震后的幻想乡(状压 DP_期望)

    题目: 洛谷 3343 BZOJ 3925 分析: 谁给我说这是个期望概率神题的,明明没太大关系好吧 「提示」里那个结论哪天想起来再问 Jumpmelon 怎么证. 首先,由于开始修路前 \(e_i\ ...

随机推荐

  1. 3.1、Jinja2模板引擎

    形式最简单的 Jinja2 模板就是一个包含响应文本的文件.示例 3-1 是一个 Jinja2 模板,它和示例 2-1 中 index() 视图函数的响应一样. 示例 3-1 templates/in ...

  2. LVM实践

    [root@ftp:/root] > fdisk -l Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors Units = ...

  3. nmcli 静态方式添加IP地址

    [root@ansible02:/root] > ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state U ...

  4. 16 个 Linux 服务器监控命令

    如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个 专业的 Linux 系统管理员. 有些 Linux 发行版会提供 GUI 程序来进行系统的监控,例如 ...

  5. 最短路&查分约束

    [HDU] 1548 A strange lift 根蒂根基最短路(或bfs)★ 2544 最短路 根蒂根基最短路★ 3790 最短路径题目 根蒂根基最短路★ 2066 一小我的观光 根蒂根基最短路( ...

  6. POJ 2184

    简单的01背包,把S看体积,把F看价值,把它们变正数处理就可以了.在处理负数时,因为减一个负数相当于加一个,所以要从前往后. #include <iostream> #include &l ...

  7. Linux--对文件夹下的配置文件批量改动IP

    sed -i 's/10.1.1.1/10.1.1.2/g' `grep -ir 10.1.1.1 * |grep -E '.xml:|.cfg:|.ini:|.wsdl:|.properties:' ...

  8. hdu 2151

    就是一个dp,数组内存的步数, 数组没清空,wa了一次 #include<cstdio> #include<algorithm> #include<cstring> ...

  9. C9---include,编译

    //main.c //include基本概念 //include是预处理指令,翻译之前会替换,编译之前左的处理,#都是预处理指令,翻译时候会添加别的内容进来. #include <stdio.h ...

  10. [IOI 1998] Polygon

    [题目链接] http://poj.org/problem?id=1179 [算法] 区间DP [代码] #include <algorithm> #include <bitset& ...