Expect the Expected UVA - 11427(概率dp)

Posted wtsruvf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Expect the Expected UVA - 11427(概率dp)相关的知识,希望对你有一定的参考价值。

题意:

  每天晚上你都玩纸牌,如果第一次就赢了,就高高兴兴的去睡觉,如果输了就继续玩。假如每盘游戏你获胜的概率都为p,每盘游戏输赢独立。如果当晚你获胜的局数的比例严格大于p时才停止,而且每天晚上最多只能玩n局,如果获胜比例一直不超过p的话,以后就再也不玩纸牌了。问在平均情况下,你会玩多少个晚上纸牌。

解析:

  求出一天的就完蛋的概率P,然后符合超几何分布,则期望的天数即为1/P

设dp[i][j]为前i次游戏 j次成功的概率  则 dp[i][j] = dp[i-1][j-1]*p + dp[i-1][j]*(1-p);

最后累加P = dp[n][1] + dp[n][2] + ```````  一直加到成功的次数除n 等于给出的p 即可

然后输出1/P

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define rap(a, n) for(int i=a; i<=n; i++)
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = 10010, INF = 0x7fffffff;
double dp[110][110];

int main()
{
    int T, kase = 0;
    cin>> T;
    while(T--)
    {
        mem(dp, 0);
        double a, b;
        int n;
        scanf("%lf/%lf%d", &a, &b, &n);
        double p = a/(double) b;
        dp[0][0] = 1, dp[0][1] = 0;
        rap(1, n)
        {
            for(int j=0; j*b <= a*i; j++)   //等价于枚举满足j/i <= a/b 的j, 但避免了误差
            {
                dp[i][j] = dp[i-1][j] * (1-p);
                if(j) dp[i][j] += dp[i-1][j-1] * p;  //防止越界
            }
        }
        double P = 0.0;
        for(int j=0; j*b <= a*n; j++)
            P += dp[n][j];

        printf("Case #%d: %d
", ++kase, (int)(1/P));


    }

    return 0;
}

 

以上是关于Expect the Expected UVA - 11427(概率dp)的主要内容,如果未能解决你的问题,请参考以下文章

UVA.11427.Expect the Expected(期望)

UVA 11427 Expect the Expected

UVA - 11427 Expect the Expected

UVA11427 Expect the Expected

UVA11427 Expect the Expected

Expect the Expected UVA - 11427(概率dp)