题面传送门

期望真 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+高斯消元)的更多相关文章

  1. 洛谷 P5249 [LnOI2019]加特林轮盘赌 题解【概率期望】【DP】

    很有意思的题目. 题目背景 加特林轮盘赌是一个养生游戏. 题目描述 与俄罗斯轮盘赌等手枪的赌博不同的是,加特林轮盘赌的赌具是加特林. 加特林轮盘赌的规则很简单:在加特林的部分弹夹中填充子弹.游戏的参加 ...

  2. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  3. 洛谷P4035 [JSOI2008]球形空间产生器(高斯消元)

    洛谷题目传送门 球啊球 @xzz_233 qaq 高斯消元模板题,关键在于将已知条件转化为方程组. 可以发现题目要求的未知量有\(n\)个,题目却给了我们\(n+1\)个点的坐标,这其中必有玄机. 由 ...

  4. 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 ...

  5. hdu4418 Time travel 【期望dp + 高斯消元】

    题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...

  6. 【noi2019集训题1】 脑部进食 期望dp+高斯消元

    题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...

  7. LightOJ 1151 Snakes and Ladders 期望dp+高斯消元

    题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定   而且 ...

  8. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

    正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...

  9. ZJUT 1423 地下迷宫(期望DP&高斯消元)

    地下迷宫 Time Limit:1000MS  Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...

随机推荐

  1. airtext初始化(一)

  2. AlertManager集群搭建

    AlertManager集群搭建 一.AlertManager集群搭建 1.背景 2.机器 3.集群可用配置 4.alertmanager启动脚本 1.127.0.0.1:9083 机器启动脚本 2. ...

  3. spring cloud feign的基本使用

    在上一节,我们学会了如何使用ribbon进行来进行服务之间的调用,但是那种需要通过RestTemplate来进行调用而且当参数比较多时,使用起来就比较麻烦.那么有没有一种调用远程方法(别的服务)就像调 ...

  4. boost编译中的细节问题

    原文链接 http://www.cppblog.com/Robertxiao/archive/2013/01/06/197022.html 生成文件命名规则:boost中有许多库,有的库需要编译.而有 ...

  5. bash执行顺序:alias --> function --> builtin --> program

    linux bash的执行顺序如下所示: 先 alias --> function --> builtin --> program 后 验证过程: 1,在bash shell中有内置 ...

  6. Relocations in generic ELF (EM: 40)

    最近在搞机器上的wifi热点,需要移植一大堆东西,如hostapd\wpa_suppliant.dhcp等,这些玩意又依赖其他的一大堆库的移植,比如libnl,openssl等,今天在移植编译libn ...

  7. Cesium实现右键框选

    思路 1.先取消地图的右键事件 2.右键框选事件,屏幕坐标转为经纬度坐标 取消地图的右键事件 //此处容易犯一个错误:以为右键事件绑定了缩放功能,伪代码即 Cesium.MouseEvent.右键事件 ...

  8. Nessus home版插件更新

    1,进入服务器停止服务 service nessusd stop 2,进入目录执行命令获取Challenge code cd /opt/nessus/sbin/ ./nessuscli fetch - ...

  9. centos安装pm2报错

    报错信息: /usr/lib/node_modules/pm2/node_modules/chalk/source/index.js:103 ...styles, 这个问题其实很简单,就是npm和no ...

  10. Go语言核心36讲(Go语言进阶技术十六)--学习笔记

    22 | panic函数.recover函数以及defer语句(下) 我在前一篇文章提到过这样一个说法,panic 之中可以包含一个值,用于简要解释引发此 panic 的原因. 如果一个 panic ...