洛谷 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必须尽快走 ...
随机推荐
- airtext初始化(一)
- AlertManager集群搭建
AlertManager集群搭建 一.AlertManager集群搭建 1.背景 2.机器 3.集群可用配置 4.alertmanager启动脚本 1.127.0.0.1:9083 机器启动脚本 2. ...
- spring cloud feign的基本使用
在上一节,我们学会了如何使用ribbon进行来进行服务之间的调用,但是那种需要通过RestTemplate来进行调用而且当参数比较多时,使用起来就比较麻烦.那么有没有一种调用远程方法(别的服务)就像调 ...
- boost编译中的细节问题
原文链接 http://www.cppblog.com/Robertxiao/archive/2013/01/06/197022.html 生成文件命名规则:boost中有许多库,有的库需要编译.而有 ...
- bash执行顺序:alias --> function --> builtin --> program
linux bash的执行顺序如下所示: 先 alias --> function --> builtin --> program 后 验证过程: 1,在bash shell中有内置 ...
- Relocations in generic ELF (EM: 40)
最近在搞机器上的wifi热点,需要移植一大堆东西,如hostapd\wpa_suppliant.dhcp等,这些玩意又依赖其他的一大堆库的移植,比如libnl,openssl等,今天在移植编译libn ...
- Cesium实现右键框选
思路 1.先取消地图的右键事件 2.右键框选事件,屏幕坐标转为经纬度坐标 取消地图的右键事件 //此处容易犯一个错误:以为右键事件绑定了缩放功能,伪代码即 Cesium.MouseEvent.右键事件 ...
- Nessus home版插件更新
1,进入服务器停止服务 service nessusd stop 2,进入目录执行命令获取Challenge code cd /opt/nessus/sbin/ ./nessuscli fetch - ...
- centos安装pm2报错
报错信息: /usr/lib/node_modules/pm2/node_modules/chalk/source/index.js:103 ...styles, 这个问题其实很简单,就是npm和no ...
- Go语言核心36讲(Go语言进阶技术十六)--学习笔记
22 | panic函数.recover函数以及defer语句(下) 我在前一篇文章提到过这样一个说法,panic 之中可以包含一个值,用于简要解释引发此 panic 的原因. 如果一个 panic ...