题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4089

题意:

  有n个人在排队激活游戏,Tomato排在第m个。

  每次队列中的第一个人去激活游戏,有可能发生以下四种情况:

    (1)激活失败,继续留在队首,等待下一次激活。

    (2)连接失败,退到队尾。

    (3)激活成功,离开队列。

    (4)服务器瘫痪。

  发生的概率分别为p1,p2,p3,p4。

  问你服务器瘫痪时,Tomato的位置<=k的概率。

题解:

  表示状态:

    dp[i][j] = probability

    表示当前还有i个人在排队,Tomato在位置j。在这以及之后服务器瘫痪时,Tomato位置<=k的概率。

  找出答案:

    ans = dp[n][m]

  如何转移:

    按着四种情况分别写就好:

      (1)j == 1:  dp[i][1] = dp[i][1]*p1 + dp[i][i]*p2 + p4

      (2)2<=j<=k: dp[i][j] = dp[i][j]*p1 + dp[i][j-1]*p2 + dp[i-1][j-1]*p3 + p4

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

    令p21 = p2/(1-p1), p31 = p3/(1-p1), p41 = p4/(1-p1)

    化简得:

      (1)j == 1:  dp[i][1] = dp[i][i]*p21 + p41

      (2)2<=j<=k: dp[i][j] = dp[i][j-1]*p21 + dp[i-1][j-1]*p31 + p41

      (3)k<j<=i:  dp[i][j] = dp[i][j-1]*p21 + dp[i-1][j-1]*p31

  边界条件:

    dp[1][1] = dp[1][1]*(p1+p2) + p4

    解得:dp[1][1] = p4/(1-p1-p2)

  然而这并没有结束……

  转移的时候显然先枚举i,在枚举j。

  可是j在当前的i中,是往两个方向转移的:

    dp[i][j]需要用到前面的dp[i][j-1],而dp[i][1]又用到了后面的dp[i][i]……QAQ

  所以迭代一下,先解出dp[i][1]:

    每一个dp[i][j]都可以表示成 dp[i][j] = p*dp[i][1] + c 的形式。

    显然对于最初的dp[i][1]: p = 1, c = 0

    对于后面的每一个dp[i][j]: p *= p21, c = c*p21 + dp[i-1][j-1]*p31 + (j<=k)*p41

    这样就由前一项的p和c,推出了当前的p和c。

    推啊推,直到推出了:dp[i][i] = p*dp[i][1] + c

    这时就可以代入解方程了:

      代入原来的递推式dp[i][1] = dp[i][i]*p21 + p41中

      得到:dp[i][1] = p21*(p*dp[i][1] + c) + p41

      解得:dp[i][1] = (p21*c + p41)/(1 - p*p21)

  然而还是没有结束……

  这题丧病卡空间……所以用滚动数组。

  由于转移的时候要用到dp[0][j]的0值,所以第一维MAX_N变成3,i=1,2轮流使用。

  这样就好啦~~~

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 2005
#define cal(x) ((!(x))?0:(2-((x)&1))) using namespace std; int n,m,k;
double p1,p2,p3,p4;
double dp[][MAX_N]; int main()
{
memset(dp,,sizeof(dp));
while(scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)!=EOF)
{
if(p4<1e-)
{
printf("0.00000\n");
continue;
}
double p21=p2/(-p1);
double p31=p3/(-p1);
double p41=p4/(-p1);
dp[cal()][]=p4/(-p1-p2);
for(int i=;i<=n;i++)
{
if(i>)
{
double p=1.0,c=;
for(int j=;j<=i;j++)
{
p*=p21;
c=c*p21+dp[cal(i-)][j-]*p31;
if(j<=k) c+=p41;
}
dp[cal(i)][]=(c*p21+p41)/(-p*p21);
}
for(int j=;j<=i;j++)
{
dp[cal(i)][j]=dp[cal(i)][j-]*p21+dp[cal(i-)][j-]*p31;
if(j<=k) dp[cal(i)][j]+=p41;
}
}
printf("%.5f\n",dp[cal(n)][m]);
}
}

HDU 4089 Activation:概率dp + 迭代【手动消元】的更多相关文章

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

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

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

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

  3. 【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1170  Solved: 683 Description ...

  4. BZOJ2707 [SDOI2012]走迷宫 【概率dp + tarjan + 高斯消元】

    题目 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...

  5. hdu4418(概率dp + 高斯消元)

    应该是一个入门级别的题目. 但是有几个坑点. 1. 只选择x能到达的点作为guass中的未知数. 2. m可能大于n,所以在构建方程组时未知数的系数不能直接等于,要+= 3.题意貌似说的有问题,D为- ...

  6. Activation HDU - 4089(概率dp)

    After 4 years' waiting, the game "Chinese Paladin 5" finally comes out. Tomato is a crazy ...

  7. Activation HDU - 4089 (概率DP)

    kuangbin的博客 强 #include <bits/stdc++.h> using namespace std; const int MAXN = 2005; const doubl ...

  8. HDU 4089 Activation(概率DP)(转)

    11年北京现场赛的题目.概率DP. 公式化简起来比较困难....而且就算结果做出来了,没有考虑特殊情况照样会WA到死的.... 去参加区域赛一定要考虑到各种情况.   像概率dp,公式推出来就很容易写 ...

  9. HDU 4418 Time travel 期望dp+dfs+高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4418 Time travel Time Limit: 2000/1000 MS (Java/Othe ...

  10. HDU 3853LOOPS(简单概率DP)

    HDU 3853    LOOPS 题目大意是说人现在在1,1,需要走到N,N,每次有p1的可能在元位置不变,p2的可能走到右边一格,有p3的可能走到下面一格,问从起点走到终点的期望值 这是弱菜做的第 ...

随机推荐

  1. ES 31 - 从0开始搭建Elasticsearch生产集群

    目录 1 配置环境 1.1 服务器IP映射 1.2 配置各节点的ssh免密通信 1.3 安装JDK并配置环境变量 2 部署单节点服务 3 部署集群服务 4 启动集群中的所有节点 4.2 启动各个节点中 ...

  2. Oracle 技术支持之现场优化的思维路径

    性能调优是每个DBA职业生涯中都能遇到的任务     大到世界五百强的核心系统,小到乡镇企业的进销存,几乎都会有要调优的时候     面对形形色色的系统,林林总总的需求,调优的手段也是丰富多彩 定位问 ...

  3. PorterDuffXferMode不对的真正原因PorterDuffXferMode深入试验)

    菜鸡wing遇敌PorterDuffXferMode,不料过于轻敌,应战吃力. 随后与其大战三天三夜.三百余回合不分胜负. 幸得 @咪咪控 相助,侥幸获胜. keyword:PorterDuffXfe ...

  4. python+pip+adb

    最近开始玩python,用它写一些小程序游戏的辅助,现在做下总结 下面进入正文. 本文适用对象为WIN10系统,安卓用户.目的在于让丝毫没有接触过Python的小伙伴都能成功运行,如果你恰好是这样的对 ...

  5. iOS Sprite Kit教程之编敲代码以及Xcode的介绍

    iOS Sprite Kit教程之编敲代码以及Xcode的介绍 Xcode界面介绍 一个Xcode项目由非常多的文件组成,比如代码文件.资源文件等.Xcode会帮助开发人员对这些文件进行管理.所以,X ...

  6. Windows下安装appium桌面版和命令行版

    安装appium桌面版和命令行版   一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本:  github search appium desktop download late ...

  7. [Matlab绘图][三维图形][三维曲线基本函数+三维曲面+其他三维图形]

    1.绘制三维图形的基本函数 最基本的三维绘图函数为plot3: plot3与plot用法十分相似,调用格式: plot(x1,y1,z1,选项1,x2,y2,z2,选项2,...,xn,yn,zn,选 ...

  8. M - 基础DP

    M - 基础DP Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descriptio ...

  9. POJ 2187 Beauty Contest【凸包周长】

    题目: http://poj.org/problem?id=1113 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

  10. MySQL查询含转义字符反斜杠的时候一直为零查询无效

    今天在查询一个字段时显示一直显示为0,可是表里明明有对应的数值. ) as vote_your_count from vote_beauty where beauty_person = '\u5c0f ...