【Foreign】开锁 [概率DP]
开锁
Time Limit: 10 Sec Memory Limit: 256 MB
Description
Input
Output
Sample Input
5 1
2 5 4 3 1
5 2
2 5 4 3 1
5 3
2 5 4 3 1
5 4
2 5 4 3 1
Sample Output
0.600000000
0.900000000
1.000000000
HINT
Main idea
一个宝箱内有一个可以开启别的宝箱的钥匙,可以选择k个宝箱,询问能开启所有宝箱的概率。
Solution
我们一看就知道这是一道概率DP的题目。
我们发现,每个宝箱有一个对应的钥匙,那么显然若干个宝箱会构成一个环,只要开了一个环中的一个宝箱就可以开启这个环。
那么我们要求的就是:在n个数中选k次,已知每个环的大小,选中环中的一个元素即视为选中了这个环,问每个环都被至少选了一次的概率。
显然直接记概率不好计算,于是我们可以算出可行的方案数。
我们先求出每个环的大小,然后令 f[i][j] 表示前 i 个环选了 j 个元素的方案数,那么显然可以枚举这一个环中选了几个,那么显然有:
然后我们最后用 f[num][k] / 总方案数 C(n,k) 即可。注意要用double来存,否则数字不够大。
Code
- #include<iostream>
- #include<string>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- using namespace std;
- const int ONE=;
- int T,n,k;
- int a[ONE],vis[ONE],cnt;
- int ring[ONE],num;
- int record;
- double C[ONE][ONE];
- double f[ONE][ONE];
- int get()
- {
- int res=,Q=;char c;
- while( (c=getchar())< || c> )
- if(c=='-')Q=-;
- res=c-;
- while( (c=getchar())>= && c<= )
- res=res*+c-;
- return res*Q;
- }
- void Solve()
- {
- n=get(); k=get();
- for(int i=;i<=n;i++) a[i]=get(),vis[i]=;
- num=;
- for(int i=;i<=n;i++)
- {
- if(vis[i]) continue;
- int x=i;
- cnt=;
- for(;;)
- {
- vis[x]=; x=a[x]; cnt++;
- if(x==i) break;
- }
- ring[++num]=cnt;
- }
- memset(f,,sizeof(f));
- f[][]=; record=;
- for(int i=;i<=num;i++)
- {
- record+=ring[i];
- for(int j=;j<=record;j++)
- {
- for(int x=;x<=ring[i] && x<=j;x++)
- {
- f[i][j] += f[i-][j-x] * C[ring[i]][x];
- }
- }
- }
- cout<<(double)f[num][k]/C[n][k]<<endl;
- }
- int main()
- {
- C[][]=;
- for(int i=;i<=;i++)
- {
- C[i][]=;
- for(int j=;j<=;j++)
- C[i][j]=C[i-][j-]+C[i-][j];
- }
- T=get();
- while(T--)
- Solve();
- }
【Foreign】开锁 [概率DP]的更多相关文章
- HihoCoder 1075 开锁魔法III(概率DP+组合)
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- 【bzoj5004】开锁魔法II 组合数学+概率dp
题目描述 有 $n$ 个箱子,每个箱子里有且仅有一把钥匙,每个箱子有且仅有一把钥匙可以将其打开.现在随机打开 $m$ 个箱子,求能够将所有箱子打开的概率. 题解 组合数学+概率dp 题目约定了每个点的 ...
- hihocoder 1075 : 开锁魔法III
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- #1075 : 开锁魔法III
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- Hiho #1075: 开锁魔法III
Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜 ...
- 【整理】简单的数学期望和概率DP
数学期望 P=Σ每一种状态*对应的概率. 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc.在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么 ...
- hihoCode 1075 : 开锁魔法III
时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅 ...
- HDU5985 Lucky Coins 概率dp
题意:给你N种硬币,每种硬币有Si个,有Pi 概率朝上,每次抛所有硬币抛起,所有反面的拿掉,问每种硬币成为最后的lucky硬币的概率. 题解:都知道是概率dp,但是模拟赛时思路非常模糊,很纠结,dp[ ...
- 概率dp总结
终于做到概率dp题了,开个总结帖记录一下 首先是几篇论文:有关概率和期望问题的研究 做了这么多题,实际上没什么特别好总结的,就是搞清状态和转移,顺着写就行了,和基本dp差不多 概率是由过去到现在dp[ ...
随机推荐
- ES6 语法糖
重新认识ES6中的语法糖:https://segmentfault.com/a/1190000010159725
- idea在Maven Projects中显示灰色的解决办法
问题描述: 在使用idea的过程中,遇到其中一个maven模块变成灰色,如下所示: 问题解决: 造成这个的原因可能是忽略了maven模块. 可以尝试如下解决方法:在idea中进入Settings–&g ...
- Python 3基础教程20-Python中导入模块和包
本文介绍Python中导入模块和包 #目录: # 导入模块和包--- # | # 上级包.上级模块.导入模块和包的init模块----- # | # 同级包.同级模块.上级包的init模块.test模 ...
- Java并发基础--线程通信
java中实现线程通信的四种方式 1.synchronized同步 多个线程之间可以借助synchronized关键字来进行间接通信,本质上是通过共享对象进行通信.如下: public class S ...
- Halcon和Opencv区别
Halcon:机器视觉行业里知名的商业视觉库,非开源的,在国内市场份额处于第一,其提供了1500个多个API算子供开发人员使用,有些编程基础的都可以轻松的入门,其调试也是很方便的,断点单步运行,图像变 ...
- 在Android Studio中创建(或添加)第一个Hello World应用程序
下面我们将使用Android Studio创建第一个简单的Hello World应用程序. 1.打开Android Studio,加载画面如下图所示: 2.选择”Start a new Andro ...
- Daily Scrum02 11.30
纵然编译大作业压顶,大家还是顶住压力,保证了软工项目的持续进行. Member Today's Task Tomorrow's Task 李孟 Task856 熟悉单元测试方法熟悉单元测试方法 Tas ...
- POI实现excel的数据验证
目录 前言 难点1:合并单元格 代码实现策略: step 1: 合并单元格 step 2: 给单元格赋值 难点2:数据验证-下拉框 代码实现策略: step 1:设置需要进行数据验证的单元格范围和可供 ...
- python的运算符及优先级与python的表达式
什么是运算符 >>在Python中,我们对一个或者是多个数字或字符串进行操作的符号 运算符有哪些 >>在Python中我们常见的运算符有:+.-.*./.**.<.> ...
- qemu的drive参数解释
drive参数很简单,可以理解成是定义了一个实际的硬盘(或者是cd)与drive对应的是device-drive option[,option[,option[,...]]] Define a new ...