当前位置: 首页 > news >正文

HDU 4089 Activation 概率DP

题目大意:Tomato要玩一个游戏,他需要排队,一开始这个队列共有N个人,而他在队列的第M个位置,每当有玩家尝试激活登陆游戏时, 会概率性触发四个事件。p1的概率注册失败,队列无变化。p2的概率连接失败,排在队首的人排到队尾。p3的概率成功,队首出队。p4的概率服务器 瘫痪,停止激活!这时候如果排在Tomato前面的人不足K个,那么他会很气愤。问 : Tomato排在第k位以内服务器瘫痪的概率。

令dp[i][j]为一共有i个人的队列Tomato排在第j位服务器瘫痪的概率,通过采用逆推,那么我们可以得到一组状态转移方程:

i == 1 : dp[1][1] = dp[1][1] * p1 + dp[1][1] * p2 + p4;

i  >  1 :

2 <= j <= k : dp[i][j] = dp[i][j] * p1 + dp[i][j - 1] * p2 + dp[i - 1][j - 1] * p3 + p4;//前面不足K个人,Tomato愤怒

k + 1 <= j <= i : dp[i][j] = dp[i][j] * p1 + dp[i][j - 1] * p2 + dp[i - 1][j - 1] * p3;

(这里k可能大于i,我们暂且不管,在下面我们再来消去这里的副作用)

令pp = p2 / (1 - p1) , pp3 = p3 / (1 - p1) , pp4 = p4 / (1 - p1);

令:

i == 1 c[1] = pp4;

2 <= j <= k : c[j] = dp[i - 1][j - 1] * pp3 + pp4;

k + 1 <= j <= i : c[j] = dp[i - 1][j - 1] * pp3;

消去k>i的情况:1 <= j <= i : c[j] = dp[i - 1][j - 1] * pp3 + (j <= k ? pp4 : 0);(这里我们默认dp[0][j]已经初始化)

进而化简得到:

j == 1 : dp[i][1] = dp[i][i] * p + c[1]; (1)

2 <= j <= i : dp[i][j] = dp[i][j - 1] * pp2 + c[j];

由递推关系可知 :dp[i][i] = dp[i][1] * p ^ (i - 1) + tmp;   (2)

其中tmp = c[1] ^ (i - 1) + c[2] ^ (i - 2) + ... + c[i - 1];

联立(1)、(2) 消去dp[i][1]得 : dp[i][i] = tmp / (1 - p ^ i); (也可以消去dp[i][i])

回代得原式     :2 <= j <  i:    dp[i][j] = dp[i][j - 1] * p + c[j];

最终解即为dp[n][m];

//HDU 4089 Activation 概率DP
/*
    p = p2 / (1 - p1)
    p31 = p3 / (1 - p1)
    p41 = p4 / (1 - p1)

    i = 1:           c[1] = pp4, dp[1][1] = pp4 / (1 - p)

             j == 1:c[1] = pp4;
        2 <= j <= k:c[j] = dp[i - 1][j - 1] * pp3 + pp4;(1)
    k + 1 <= j <= i:c[j] = dp[i - 1][j - 1] * pp3;      (2)
    联立(1)、(2) 得:2 <= j <= i:    c[j] = dp[i - 1][j - 1] * pp3 + (i <= k ? pp4 : 0);

    易知:
             j == 1:dp[i][1] = dp[i][i] * p + c[1];     (3)
        2 <= j <= k:dp[i][j] = dp[i][j - 1] * p + c[j]; (4)
    k + 1 <= j <= i:dp[i][j] = dp[i][j - 1] * p + c[j]; (5)
    联立(4)、(5) 得:2 <= j <= i:    dp[i][j] = dp[i][j - 1] * p + c[j];

    由递推关系可知 :dp[i][i] = dp[i][1] * pow(p, i - 1) + tmp;   (6)
    其中tmp = c[1] ^ (i - 1) + c[2] ^ (i - 2) + ... + c[i - 1];
    联立(3)、(6) 得:dp[i][i] = tmp / (1 - pow(p, i));
    回代得原式     :2 <= j <  i:    dp[i][j] = dp[i][j - 1] * p + c[j];

    最终解即为dp[n][m];
*/

#include <stdio.h>
#include <string.h>
#define REP(i, a, b) for(int i = a; i <= b; ++i)
const double eps = 1e-5;
const int O = 2005;
double pp[O], dp[O][O], c[O], p1, p2, p3, p4, p, pp3, pp4;
int n, m, k;
void work(){
    if(1 - p1 - p2 < eps){//特判除数等于0的情况
        printf("%.5f\n", 0);
        return;
    }
    if(p4 < eps){//如果已经小于0.00001则直接输出0.00000
        printf("%.5f\n", 0);
        return;
    }
    p = p2 / (1 - p1);
    pp3 = p3 / (1 - p1);
    pp4 = p4 / (1 - p1);
    pp[0] = 1.0;
    REP(i, 0, n) dp[0][i] = dp[i][i] = 0;
    REP(i, 1, n) pp[i] = p * pp[i - 1];
    dp[1][1] = p4 / (1 - p1 - p2);
    REP(i, 2, n){
        REP(j, 1, i) c[j] = dp[i - 1][j - 1] * pp3 + (j <= k ? pp4 : 0);
        REP(j, 1, i) dp[i][i] += c[j] * pp[i - j];
        dp[i][i] /= (1 - pp[i]);
        dp[i][1] = dp[i][i] * p + c[1];
        REP(j, 2, i - 1) dp[i][j] = dp[i][j - 1] * p + c[j];
    }
    printf("%.5f\n", dp[n][m]);
}
int main(){
    while(~scanf("%d%d%d%lf%lf%lf%lf", &n, &m, &k, &p1, &p2, &p3, &p4)) work();
    return 0;
}
HDU 4089

 

转载于:https://www.cnblogs.com/ac-luna/p/3739601.html

相关文章:

  • Android 百度地图定位(手动+自动) 安卓开发教程
  • Nagios 监控温度感应器
  • 转:第二次重置OPPO手机官网任意账户密码(秒改)
  • Django 多数据操作 router 方法
  • java设计模式_代理模式
  • Gradle 取相对路径
  • VIEW登陆故障解决办法。
  • 有规律的坚持写文章有多难?
  • log4j+commons-logging结合使用
  • java每日小算法(20)
  • Dive into Python
  • ORA-00600错误及其解决方案
  • java-第二章-华氏温度转摄氏温度
  • jprofile学习资料
  • OpenGL基础图形编程 - 复杂物体建模
  • C学习-枚举(九)
  • Docker 笔记(2):Dockerfile
  • eclipse的离线汉化
  • exif信息对照
  • HashMap剖析之内部结构
  • JavaScript设计模式系列一:工厂模式
  • JS笔记四:作用域、变量(函数)提升
  • JS字符串转数字方法总结
  • PermissionScope Swift4 兼容问题
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React组件设计模式(一)
  • windows下mongoDB的环境配置
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 记录:CentOS7.2配置LNMP环境记录
  • 理清楚Vue的结构
  • 聊聊flink的TableFactory
  • 聊聊sentinel的DegradeSlot
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 用mpvue开发微信小程序
  • ​iOS安全加固方法及实现
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Z2294. 打印树的直径
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (1)常见O(n^2)排序算法解析
  • (C语言)二分查找 超详细
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (三) diretfbrc详解
  • (三)c52学习之旅-点亮LED灯
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)ABI是什么
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ./configure,make,make install的作用
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理出现中文乱码的情况