题意:Tomato要在服务器上激活一个游戏,一开始服务器序列中有N个人,他排在第M位,每次服务器会对序列中第一位的玩家进行激活,有四种结果:

1.有p1的概率会激活失败,这时候序列的状态是不变的。
2.有p2的概率第一位的玩家会连接错误,这时候序列中第一位的玩家会成为最后一位,其他玩家相对位置不变。
3.有p3的概率第一位的玩家激活成功,这时候第一位的玩家会离开序列。
4.有p4的概率服务器崩溃,发生这件事之后所有玩家都不能激活了。
求Tomato遇到服务器崩溃并且在服务器崩溃时处于前K位的概率。

解法:这道题是一道非常好的概率DP题。必须一步一步来全部理解之后自己写一遍。

首先是设计状态dp[i]j[]代表队伍有i个人主角现在拍第j的概率。

写出状态转移方程(搭配题意写):

j==1 ,dp[i][j]=p1dp[i][j]+p2dp[i][i]

1<j<=k ,dp[i][j]=p1dp[i][j]+p2dp[i][j-1]+p3dp[i-1][j-1]+p4

j>k ,dp[i][j]=p1dp[i][j]+p2dp[i][j-1]+p3dp[i-1][j-1]

初步化简上诉式子:

其中 pp=1/(1-p1)

j==1 ,dp[i][j]=pp*p2dp[i][i]

1<j<=k ,dp[i][j]=pp*p2dp[i][j-1]+pp*p3dp[i-1][j-1]+pp*p4

j>k ,dp[i][j]=pp*p2dp[i][j-1]+pp*p3dp[i-1][j-1]

深度抽象上诉式子:

j==1 ,dp[i][j]=k[j] * dp[i][i] + b[j]

1<j<=k ,dp[i][j]=k[j] * dp[i][j-1] + b[j]

j>k ,dp[i][j]=k[j] * dp[i][j-1] + b[j]

(为什么是这样:我们仔细观察初步化简的式子:每一个方程右边除了dp[i][i]/dp[i][j-1]是与i同阶的,后面的都是i-1阶的,因为我们是一层一层做dp的,也就是说后面的可以看成是常数,所以这里的kj和bj具体是什么我们先根据初步化简的式子求出来放到数组里当成常数然后就不用管了)

我们仔细观察上诉深度化简的式子,发现其实第i阶就是有n个变量dp[i][j],然后有n个不同的方程,那么就一定可以用高斯消元解出方程!!!

但是再次仔细观察发现:欸!这n个方程结构很简单恰好形成了个环形!!那么我们就可以利用这点直接先解出一个未知数,然后递推出全部的未知数!

怎么解?

我们用笨方法模拟一下:假设只有3个未知数

dp1=k1dp3+c1

dp2=k2( k1dp3 + c1 ) +c2

dp3=k3( k2( k1dp3 + c1 ) +c2 ) + c3

我们尝试把dp3化简:  dp3=k3k2k1dp3 + k3k2c1 + k3c2 + c3

那么规律不就出来了吗!

于是我们解出dp[i][i]再解出dp[i][1],然后就可以愉快地递推后面的值了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=2e3+;
  4. const double eps=1e-;
  5. int n,m,K;
  6. double p1,p2,p3,p4,pp,p14;
  7. double k[N],b[N],dp[N][N];
  8.  
  9. void init() {
  10. for (int i=;i<=n;i++) k[i]=b[i]=;
  11. for (int i=;i<=n;i++) for (int j=;j<=n;j++) dp[i][j]=;
  12. }
  13.  
  14. int main()
  15. {
  16. while (cin>>n && n) {
  17. cin>>m>>K;
  18. cin>>p1>>p2>>p3>>p4;
  19. init();
  20. if (fabs(p4)<eps) {
  21. printf("%.5lf\n",); continue;
  22. }
  23. pp=1.0/(1.0-p1); p14=1.0/(1.0-p1-p4);
  24.  
  25. for (int i=;i<=n;i++) k[i]=pp*p2;
  26.  
  27. dp[][]=p4/(-p1-p2);
  28. for (int i=;i<=n;i++) {
  29. b[]=pp*p4;
  30. for (int j=;j<=K;j++) b[j]=pp*p3*dp[i-][j-]+pp*p4;
  31. for (int j=K+;j<=i;j++) b[j]=pp*p3*dp[i-][j-];
  32.  
  33. double kk=1.0,bb=;
  34. for (int j=i;j;j--) {
  35. bb+=kk*b[j];
  36. kk=k[j]*kk;
  37. }
  38.  
  39. dp[i][i]=bb/(1.0-kk);
  40. dp[i][]=k[]*dp[i][i]+b[];
  41. for (int j=;j<i;j++) dp[i][j]=k[j]*dp[i][j-]+b[j];
  42. }
  43. printf("%.5lf\n",dp[n][m]);
  44. }
  45. return ;
  46. }

HDU4089/Uva1498 Activation 概率DP(好题)的更多相关文章

  1. 13年山东省赛 The number of steps(概率dp水题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud The number of steps Time Limit: 1 Sec  Me ...

  2. Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题

    除非特别忙,我接下来会尽可能翻译我做的每道CF题的题面! Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题 题面 胡小兔和司公子都认为对方是垃圾. 为了决出谁才是垃 ...

  3. [HDU 4089]Activation[概率DP]

    题意: 有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有以下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排在队列的最后( ...

  4. [HDU4089]Activation(概率DP)

    HDU4089 题意:有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有一下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排 ...

  5. HDU 4089 Activation 概率DP 难度:3

    http://acm.hdu.edu.cn/showproblem.php?pid=4089 这道题中一共有两个循环: 1.事件1 如果一直落在Activation failed事件上,那么就会重新继 ...

  6. poj 3071 Football (概率DP水题)

    G - Football Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  7. hdu4405Aeroplane chess 概率dp水题

    //从0到n有n+1个格子 //对于格子i,掷一次骰子的数为x.那么能够从位置i到位置i+x //格子之间有连线,假设格子a和b有连线,那么从a到b不用掷骰子 //求从0到n的骰子掷的次数的期望 // ...

  8. 【BZOJ1426】收集邮票 概率DP 论文题 推公式题

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  9. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

随机推荐

  1. JVM内存分配调优

    Reference: https://time.geekbang.org/column/article/108139 参考指标 GC频率:⾼频的FullGC会给系统带来⾮常⼤的性能消耗,虽然Minor ...

  2. 【leetcode】394. Decode String

    题目如下: 解题思路:这种题目和四则运算,去括号的题目很类似.解法也差不多. 代码如下: class Solution(object): def decodeString(self, s): &quo ...

  3. [原创] Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍

    Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍 函数原型:HWND HtmlHelpA( HWND hwndCaller, LPCSTR pszFile, UINT uCo ...

  4. linux运维、架构之路-linux文件权限

    一. R W X对应的数字及计算的方法 1.linux普通文件权限总结 ①r可读:表示具有读取.浏览文件内容(block)的权限 ②w可写:表示具有新增.修改文件内容的权限删除文件(修改文件名.)或创 ...

  5. Bugku 杂项 这是一张单纯的图片

    这是一张单纯的图片 将图片用winhex打开 会发现在最后的部分有html实体编码 decode一下得到 key{you are right} 关于html实体编码 对于某些特殊字符如 < 与 ...

  6. 富文本编辑器tinymce支持从word复制粘贴保留格式和图片的插件wordpaster

    tinymce是很优秀的一款富文本编辑器,可以去官网下载.https://www.tiny.cloud 这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用. http ...

  7. java 中异常类

    算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...

  8. IP地址的分类及各类IP的最大网络数、网络号范围和最大主机数

    总结自谢希仁老师的<计算机网络>第五版 每一类网络地址都由两部分组成:网络号net-id+主机号host-id.IP地址的分类可以参看下图: 可以看到各个类别的区别,同时,所有的类别都是3 ...

  9. P1541乌龟棋

    传送 这题咋做? 当然是爆搜了. 但是蒟蒻不会爆搜(TLE,WA两开花qwq),更不会记忆化搜索,所以我们换个思路. 注意这句话: 这肯定是有用的(洛咕还不会闲圈到给一句毛用都没有的话),那它有什么用 ...

  10. 术语-IT术语-全栈工程师:全栈工程师

    ylbtech-术语-IT术语-全栈工程师:全栈工程师 全栈工程师是指掌握多种技能,并能利用多种技能独立完成产品的人. 1.返回顶部 1. 中文名:全栈工程师 外文名:Full Stack engin ...