洛谷 P5249 - [LnOI2019]加特林轮盘赌(期望 dp+高斯消元)
期望真 nm 有意思,所以蒟蒻又来颓期望辣
先特判掉 \(P_0=0\) 的情况,下面假设 \(P_0\ne 0\)。
首先注意到我们每次将加特林对准一个人,如果这个人被毙掉了,那么相当于进入了 \(n-1\) 个人的状态,否则等价于每个人都向前移动了一个位置,原来第 \(k\) 个位置上的人挪到了第 \(k-1\) 个位置上,故我们考虑设 \(dp_{i,j}\) 表示在有 \(i\) 个人的状态下,第 \(j\) 个人成为唯一的幸存者的概率。考虑转移,这里不妨假设 \(j>2\),考虑第一个人是否被毙掉,如果被毙掉了那么相当于 \(i-1\) 个人中第 \(j-1\) 个人成为唯一幸存者的概率,即 \(P_0dp_{i-1,j-1}\),否则每个人都向前挪了一位,原来第 \(j\) 个人变成了第 \(j-1\) 个人,即 \((1-P_0)dp_{i,j-1}\),故我们有 \(dp_{i,j}=P_0dp_{i-1,j-1}+(1-P_0)dp_{i,j-1}\),这样可以得到 \(i-1\) 个方程,可是要求出每个 \(dp_{i,j}\) 至少要 \(i\) 个方程啊……别急,显然最终幸存者一定存在于这 \(i\) 个人当中,因此所有 \(dp_{i,j}\) 的和为 \(1\),即 \(\sum\limits_{j=1}^idp_{i,j}=1\),这样就有 \(i\) 个方程了,可高斯消元了,复杂度 \(n·n^3=n^4\),一脸过不去的样子。
注意到这题中方程组的特殊性,如果我们先求出 \(dp_{1}\),在求出 \(dp_2,dp_3,\cdots\),那么在求 \(dp_{i,j}\) 时,\(P_0dp_{i-1,j-1}\) 必定是一个常数,也就是说前面 \(i-1\) 个方程都可以写成 \(dp_{i,j}=adp_{i,j-1}+b_j\) 的形式,因此我们考虑将所有 \(dp_{i,j}\) 都表示为 \(x_jdp_{i,1}+y_j\) 的形式,这显然可以在线性时间内求出,具体来说就 \(x_j=(1-P_0)x_{j-1},y_j=(1-P_0)y_{j-1}+P_0dp_{i-1,j-1}\),线性递推即可,这样最后 \(\sum\limits_{j=1}^idp_{i,j}=1\) 就可以化为 \((\sum\limits_{j=1}^ix_j)dp_{i,1}+(\sum\limits_{j=1}^iy_j)=1\),简单解个方程即可求出 \(dp_{i,1}\),然后再回代递推出其他 \(dp_{i,j}\) 即可,这样复杂度即可降到 \(n^2\)。
由于每次我们求 \(dp_i\) 只用到 \(dp_{i-1}\) 的值,因此需采用滚动数组优化空间,这样空间复杂度即可降到 \(\mathcal O(n)\)。
const int EPS=1e-8;
const int MAXN=1e4;
double p0;int n,k;
double pre[MAXN+5],cur[MAXN+5];
double calc(int n){
double sa=1,sb=0,cur=1,sum=0;
for(int i=2;i<=n;i++){
cur*=(1-p0);sum*=(1-p0);sa+=cur;
sum+=pre[i-1]*p0;sb+=sum;
} return (1-sb)/sa;
}
int main(){
scanf("%lf%d%d",&p0,&n,&k);
if(p0==0) return printf("%d\n",(n==1)?1:0),0;
pre[1]=1;
for(int i=2;i<=n;i++){
cur[1]=calc(i);
for(int j=2;j<=i;j++) cur[j]=cur[j-1]*(1-p0)+pre[j-1]*p0;
for(int j=1;j<=i;j++) pre[j]=cur[j];
} printf("%.10lf\n",pre[k]);
return 0;
}
洛谷 P5249 - [LnOI2019]加特林轮盘赌(期望 dp+高斯消元)的更多相关文章
- 洛谷 P5249 [LnOI2019]加特林轮盘赌 题解【概率期望】【DP】
很有意思的题目. 题目背景 加特林轮盘赌是一个养生游戏. 题目描述 与俄罗斯轮盘赌等手枪的赌博不同的是,加特林轮盘赌的赌具是加特林. 加特林轮盘赌的规则很简单:在加特林的部分弹夹中填充子弹.游戏的参加 ...
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- 洛谷P4035 [JSOI2008]球形空间产生器(高斯消元)
洛谷题目传送门 球啊球 @xzz_233 qaq 高斯消元模板题,关键在于将已知条件转化为方程组. 可以发现题目要求的未知量有\(n\)个,题目却给了我们\(n+1\)个点的坐标,这其中必有玄机. 由 ...
- HDU 2262 Where is the canteen 期望dp+高斯消元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...
- hdu4418 Time travel 【期望dp + 高斯消元】
题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...
- 【noi2019集训题1】 脑部进食 期望dp+高斯消元
题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...
- LightOJ 1151 Snakes and Ladders 期望dp+高斯消元
题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定 而且 ...
- P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...
- ZJUT 1423 地下迷宫(期望DP&高斯消元)
地下迷宫 Time Limit:1000MS Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...
随机推荐
- springboot 事务执行全流程分析
springboot 事务执行全流程分析 目录 springboot 事务执行全流程分析 1. 事务方法执行前的准备工作 2. 业务代码的调用 3. 事务方法执行后处理 4. 业务代码在事务和非事务中 ...
- kivy Label触发事件
kivy label也可以触发事件,为什么只有我这么无聊学垃圾kivy """ 在通过ref标记一段文本后点击这段文本就可以触发'on_ref_press'事件,在该事 ...
- 正则表达式: NFA引擎匹配原理
NFA引擎匹配原理 1 为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动 ...
- [no code][scrum meeting] Beta 11
$( "#cnblogs_post_body" ).catalog() 例会时间:5月26日11:30,主持者:肖思炀 下次例会时间:5月27日11:30,主持者:乔玺华 一.工作 ...
- Noip模拟20 2021.7.19
T1 玩具 题目读错意思直接报零... 拼接方式没读懂以为是个数学题,用卡特兰数,可是的确想多了 数据范围表达出你怎么暴力都行,选择$n^3,dp$ 相当于一片森林,每次多加一条边就合并成一棵树 在$ ...
- 2021.10.27考试总结[冲刺NOIP模拟17]
T1 宝藏 发现每个数成为中位数的长度是关于权值单调的.线段树二分判断是否合法,单调指针扫即可. 考场上写了二分,平添\(\log\). \(code:\) T1 #include<bits/s ...
- python的random模块生成随机数
python的random函数 random.random() 生成0-1之间的随机数 random.uniform(a,b)生成a,b之间的浮点数 random.randint(a,b)生成a,b之 ...
- 利用Wireshark 解密HTTPS流量
在我之前的一篇文章中已经介绍了一种解密HTTPS流量的一种方法,大致方法就是客户端手动信任中间人,然后中间人重新封包SSL流量. 文章地址: http://professor.blog.51cto.c ...
- 基于eNSP的NAT/NAPT协议仿真实践
一. 基本原理 eNSP(Enterprise Network Simulation Platform)是一款由华为提供的.可扩展的.图形化 操作的网络仿真工具平台,主要对企业网络路由器.交换机进行软 ...
- Jenkins MultiJob
前提:项目有十几个服务每次发版/更新服务需要一个个去编译 目的:希望能够建立一个任务一次构建可以批量编译很多服务,并且需要输入一个参数指定编译的分支 需要插件: MultiJob 安装插件 1.在Je ...