hdu-4089-Activation-概率dp

kuangbin题解写的很好,我就不赘余了。。

一下解释来自kuangbin:

题意:有n个人排队等着在官网上激活游戏。Tomato排在第m个。

对于队列中的第一个人。有一下情况:

1、激活失败,留在队列中等待下一次激活(概率为p1)

2、失去连接,出队列,然后排在队列的最后(概率为p2)

3、激活成功,离开队列(概率为p3)

4、服务器瘫痪,服务器停止激活,所有人都无法激活了。

求服务器瘫痪时Tomato在队列中的位置<=k的概率

解析:

概率DP;

设dp[i][j]表示i个人排队,Tomato排在第j个位置,达到目标状态的概率(j<=i)

dp[n][m]就是所求

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

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

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

化简:

j==1:    dp[i][1]=p*dp[i][i]+p41;

2<=j<=k: dp[i][j]=p*dp[i][j-1]+p31*dp[i-1][j-1]+p41;

k<j<=i:  dp[i][j]=p*dp[i][j-1]+p31*dp[i-1][j-1];

其中:

p=p2/(1-p1);

p31=p3/(1-p1)

p41=p4/(1-p1)

可以循环i=1->n 递推求解dp[i].在求解dp[i]的时候dp[i-1]就相当于常数了。

在求解dp[i][1~i]时等到下列i个方程

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

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

k<j=i:  dp[i][j]=p*dp[i][j]+c[j];

其中c[j]都是常数了。上述方程可以解出dp[i]了。

首先是迭代得到 dp[i][i].然后再代入就可以得到所有的dp[i]了。

注意特判一种情况。就是p4<eps时候,就不会崩溃了,应该直接输出0。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
using namespace std;
#define eps 1e-9
#define zero(x) ((fabs(x)<eps?0:x))
#define maxn 2200
double dp[maxn][maxn];
double c[maxn];
double p[maxn];
int main()
{
    int n,m,k;
    double p1,p2,p3,p4;
    while(~scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4))
    {
        if(p4<eps)
        {
            puts("0.00000");
            continue;
        }
        double p21=p2/(1-p1);
        double p41=p4/(1-p1);
        double p31=p3/(1-p1);
        p[0]=1.0;
        for(int i=1;i<=n;i++)p[i]=p[i-1]*p21;
        dp[1][1]=p41/(1-p21);
        for(int i=2;i<=n;i++)
        {
            double tmp=p[i-1]*p41;
            for(int j=2;j<=k&&j<=i;j++)c[j]=p31*dp[i-1][j-1]+p41;
            for(int j=k+1;j<=i;j++)c[j]=p31*dp[i-1][j-1];
            for(int j=2;j<=i;j++)tmp+=p[i-j]*c[j];
            dp[i][i]=tmp/(1-p[i]);
            dp[i][1]=p21*dp[i][i]+p41;
            for(int j=2;j<i;j++)dp[i][j]=p21*dp[i][j-1]+c[j];
        }
        printf("%.5f\n",dp[n][m]);
    }
    return 0;
}

hdu-4089-Activation-概率dp

时间: 2024-08-28 02:54:26

hdu-4089-Activation-概率dp的相关文章

HDU 4089 Activation (概率dp 好题 + 难题)

Activation Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1842    Accepted Submission(s): 689 Problem Description After 4 years' waiting, the game "Chinese Paladin 5" finally comes out.

hdu 4089 不错的DP 北京现场赛题

http://acm.hdu.edu.cn/showproblem.php?pid=4089 还有疑惑,需要重新推: 但是学到的: 1.A=a+b+c  abc是三种情况,那么P(A)=a*P(a->事件)+b*P(b->事件)+c*P(c->事件); a->事件意思是 在a情况下的事件,就是全概率公式的思想吧 2.一定注意每一步会不会出现分母为0 的情况,以及预处理的时候对于一些特殊情况导致自己的式子会出现分母为0的排除掉 3.概率DP经常出现推出了式子但是自己不会写代码的情况,

hdu 4870 Rating(概率DP&amp;高数消元)

Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 714    Accepted Submission(s): 452 Special Judge Problem Description A little girl loves programming competition very much. Recently, she

HDU 4035Maze(概率DP)

HDU 4035   Maze 体会到了状态转移,化简方程的重要性 题解转自http://blog.csdn.net/morgan_xww/article/details/6776947 /** dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 (概率为ei) 3.和该点相连有m条边,随机走一条 求:走出迷宫所要走的边数的期望值. 设 E[i]表示

HDU 3853 LOOPS (概率dp)

LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Submission(s): 2931    Accepted Submission(s): 1209 Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wants to help

HDU - 1099 - Lottery - 概率dp

http://acm.hdu.edu.cn/showproblem.php?pid=1099 最最简单的概率dp,完全是等概率转移. 设dp[i]为已有i张票,还需要抽几次才能集齐的期望. 那么dp[n]=0,因为我们已经集齐了. \[dp[i]=(\frac{i}{n}*dp[i]+\frac{n-i}{n}*dp[i+1])+1\] 移项得答案. 然后写个分数类,注意约分. #include<bits/stdc++.h> using namespace std; typedef long

HDU 4599 Dice (概率DP+数学+快速幂)

题意:给定三个表达式,问你求出最小的m1,m2,满足G(m1) >= F(n), G(m2) >= G(n). 析:这个题是一个概率DP,但是并没有那么简单,运算过程很麻烦. 先分析F(n),这个用DP来推公式,d[i],表示抛 i 次连续的点数还要抛多少次才能完成.那么状态转移方程就是 d[i] = 1/6*(1+d[i+1]) + 5/6*(1+d[1]), 意思就是说在第 i 次抛和上次相同的概率是1/6,然后加上上次抛的和这一次,再加上和上次不同的,并且又得从第1次开始计算. 边界就是

hdu 5001 walk 概率dp入门题

Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will travel t

HDU 4711 Weather 概率DP

题意:有个人,他在某个区域待了n天,这个区域有m个地方,有w种天气情况,先给出这个人行程的每天的天气情况,然后给出 从第i个地方到第j个地方的概率,也可以自身到自身,然后给出 某个地方 是某种天气的概率,问你 这个人最优可能的行程路线也就是每天待在哪个地方, 概率DP,求出哪些路线概率最大 再在其中取最小字典序的 假设方程 dp[i][j] 代表 第i天待在j城市,状态转移 dp[i][j] = max(dp[i][j],dp[i - 1][k] * mp[k][j] * pp[j][nnum[

HDU 3853 期望概率DP

期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] ,  右移:[x][y]->[x][y+1]=p[x][y][1];  左移:[x][y]->[x+1][y]=p[x][y][2]; 问最后走到[r,c]的期望 dp[i][j]为从[i][j]点走到[r][c]的期望 有方程: dp[i][j]=    (dp[i][j]+2)*p[i][j][0]  +   (dp