UVA11427 Expect the Expected 概率dp+全概率公式

Posted mountaink

tags:

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

题目传送门

题意:小明每晚都玩游戏,每一盘赢的概率都是p,如果第一盘就赢了,那么就去睡觉;否则继续玩,玩到赢的比例大于p才去睡;如果一直玩了n盘还没完成,就第二天再玩,并且游戏记录清空;问他玩游戏天数的期望;

思路:由于每次玩游戏,每天玩游戏都是独立重复试验,所以可以考虑一天玩游戏,玩不到p的概率(p都玩不到?)。

  设$dp[i][j]$表示玩了i次游戏,获胜j次,并且过程中期望都不会超过p的概率。

  则显然有:$dp[i][j]=dp[i-1][j]*(1-p)+dp[i-1][j-1]*p$。

   需要注意的是,我们必须保证过程中游戏分数的期望不会超过p,所以每一个状态都必须是$\fracji<p$,而且由于是T组样例,记得每次都要清空dp数组,否则上一次的答案可能会影响当前这次(上一次不合法的状态到了这一次变成合法状态了,被统计入了答案)。

  然后求出总的失败概率,设概率为q,期望天数为e。

  由全概率公式可得$e=q*1+(1-q)*(e+1)$

  移项得$e=/frac1q$

#pragma GCC optimize (2)
#pragma G++ optimize (2)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<bits/stdc++.h>
#include<unordered_map>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define dep(i,b,a) for(int i=b;i>=a;--i)
#define clr(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pii pair<int,int >
using namespace std;
typedef long long ll;
ll rd()

    ll x=0,f=1;char ch=getchar();
    while(ch<0||ch>9)if(ch==-)f=-1;ch=getchar();
    while(ch>=0&&ch<=9)x=x*10+ch-0;ch=getchar();
    return x*f;

const int maxn=110;
double dp[maxn][maxn];
int x,y,n;
int main()
    int T,cat=1;
    cin>>T;
    while(T--)
        scanf("%d/%d%d",&x,&y,&n);
        double p=(double)x/y;
        clr(dp,0);
        dp[0][0]=1;
        rep(i,1,n)
            for(int j=0;j*y<=i*x;j++)
                dp[i][j]=dp[i-1][j]*(1-p);
                if(j)dp[i][j]+=dp[i-1][j-1]*p;
            
        
        double res=0;
        for(int i=0;i*y<=n*x;i++)
                res+=dp[(int)n][i];
        
        printf("Case #%d: %d\n",cat++,(int)(1/res));
    
 

 

以上是关于UVA11427 Expect the Expected 概率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)