Codeforces 482C Game with Strings(dp+概率)
题目链接:Codeforces 482C Game with Strings
题目大意:给定N个字符串,如今从中选定一个字符串为答案串,你不知道答案串是哪个。可是能够通过询问来确定,
每次询问一个位置上字符为多少。
如今你询问的每一个位置的概率是同样的,(问过的位置不会再问)。求询问次数的期
望。
解题思路:由于字符串长度不会大于20。所以用二进制表示询问了哪些位置。C[s]即为询问s的位置能够确定多少个字
符串。
这步不能通过枚举s,然后推断处理,复杂度为o(2^20 * 20 * 50),太高。
能够通过枚举两个字符串,推断它们哪些
位置同样,则在相应的s状态下标记这两个字符串无法被区分,最后在遍历一遍s状态递推一次,由于假设s1状态包括s2
状态。那么s2状态下不能区分的字符串相同在s1状态无法区分。
确定每一个状态下可区分字符串的个数之后就好做了,dp[s]表示移动到状态s后还要继续推断的概率,不用继续推断的直
接加到相应的步数中。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<ll, int> pii;
const int maxs = (1<<20) + 5;
const int maxn = 55;
const int maxm = 25;
const ll x = 123;
int N, L, T, C[maxs];
ll D[maxs];
char str[maxn][maxm];
inline int idx(char ch) {
if (ch >= 'a' && ch <= 'z')
return ch - 'a';
return ch - 'A' + 26;
}
inline int bitcount(ll x) {
return x == 0 ? 0 : bitcount(x>>1) + (x&1);
}
void init () {
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%s", str[i]);
L = strlen(str[0]);
T = (1<<L);
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
int s = 0;
for (int k = 0; k < L; k++)
s |= (str[i][k] == str[j][k]) << k;
D[s] |= (1LL<<i) | (1LL<<j);
}
}
for (int i = T-1; i; i--) {
for (int j = 0; j < L; j++)
if (i&(1<<j))
D[i^(1<<j)] |= D[i];
C[i] = N - bitcount(D[i]);
}
}
double dp[maxs], p[100];
int main () {
init();
if (N == 1) {
printf("%.9lf\n", 0.0);
return 0;
}
dp[0] = 1;
for (int u = 0; u < T; u++) {
int bit = bitcount(u), sum = N - C[u];
double mv = dp[u] / (L - bit);
if (N == C[u]) continue;
for (int i = 0; i < L; i++) {
if (u&(1<<i))
continue;
int s = u | (1<<i);
double a = 1.0 * (C[s] - C[u]) / sum;
dp[s] += mv * (1 - a);
p[bit+1] += mv * a;
}
}
/*
double sum = 0;
for (int u = 1; u <= L; u++) {
printf("%lf\n", p[u]);
sum += p[u];
}
printf("%lf!\n", sum);
*/
double ans = 0;
for (int i = 1; i <= L; i++)
ans += p[i] * i;
printf("%.9lf\n", ans);
return 0;
}
Codeforces 482C Game with Strings(dp+概率)的更多相关文章
- CodeForces 482C Game with Strings
意甲冠军: n一定长度m串 隐藏的字符串相等的概率 然后,你猜怎么着玩家隐藏的字符串 的询问字符串的一个位置 再不断的知道一些位置后 游戏者就能够确定藏起来的串是什么 问 游戏者的期望步 ...
- Codeforces 360C Levko and Strings dp
题目链接:点击打开链接 题意: 给定长度为n的字符串s,常数k 显然s的子串一共同拥有 n(n-1)/2 个 要求找到一个长度为n的字符串t,使得t相应位置的k个子串字典序>s #include ...
- codeforces 696B B. Puzzles(树形dp+概率)
题目链接: B. Puzzles time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- UVA 11427 Expect the Expected(DP+概率)
链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35396 [思路] DP+概率 见白书. [代码] #include&l ...
- tyvj P1864 [Poetize I]守卫者的挑战(DP+概率)
P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...
- Codeforces 385B Bear and Strings
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...
- [LnOI2019]加特林轮盘赌(DP,概率期望)
[LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- Codeforces Round #358 (Div. 2) D. Alyona and Strings dp
D. Alyona and Strings 题目连接: http://www.codeforces.com/contest/682/problem/D Description After return ...
随机推荐
- SQL IN
here are some additional clause in the SQL language that can be used to simplify queries by decrease ...
- 解决Ubuntu环境变量错误导致无法正常登录
一.问题产生 配置JDK时,按照搜索到的一篇文章中的做法,修改了/etc/profile文件里的内容.在原内容保持不变的基础上,大致添加了以下内容: export JAVA_HOME=.... exp ...
- [Node.js] Level 6. Socket.io
6.2 Setting Up socket.io Server-Side So far we've created an Express server. Now we want to start bu ...
- HTTP协议响应消息的常用状态码【转】
“100″ : Continue(继续) 初始的请求已经接受,客户应当继续发送请求的其余部分.(HTTP 1.1新) “101″ : Switching Protocols(切换协议) 请求者已要求服 ...
- UITextView 添加 pleaceholder
UITextView 默认没有 pleaceholder属性: 我们可以通过多种方式添加 在UITextView的代理方法中写 - (void)textViewDidBeginEditing:(UIT ...
- tarjan+缩点+强连通定理
C - Network of Schools Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I ...
- Java之字节码(3) - 简单介绍
转载来自 首先了解一下理论知识: 字节码: Class文件是8位字节流,按字节对齐.之所以称为字节码,是因为每条指令都只占据一个字节,所有的操作码和操作数都是按字节对齐的.如:0×03表示iconst ...
- js&jquery获取指定table指定行里面的内容
js&jquery获取指定table指定行里面的内容 CreateTime--2018年5月18日11:46:04 Author:Marydon 1.展示 代码展示 <table s ...
- 【Android】在build/envsetup.sh中添加自己的命令(函数)
由于测试的需要,经常需要手动刷入boot.img和system.img,把它写到envsetup.sh就可以每次使用一行命令来代替了: function flashtestimage(){ if [[ ...
- 【JS】jQuery中将数组转换成字符串join()和push()使用
1.push()将元素依次添加至数组:2.join()将数组转换成字符串,里面可以带参数分隔符,默认[,] <script type = text/javascript> $(docume ...