1. 程式人生 > >UVA.11427.Expect the Expected(期望)

UVA.11427.Expect the Expected(期望)

str problem 題目 span pri 當前 .org += int

題目鏈接

\(Description\)

https://blog.csdn.net/Yukizzz/article/details/52084528
技術分享圖片

\(Solution\)

首先每一天之間是獨立的。
所以設\(f[i][j]\)為前\(i\)天贏了\(j\)局的概率,要滿足當前獲勝比例始終≤\(p\)。容易得出轉移方程。
所以玩完\(n\)局之後獲勝比例仍不超過\(p\)的概率為\(Q=\sum_{i=0}^{\frac in\leq p}f[n][i]\)
\(E\)為期望玩牌天數。有兩種情況:
1.\(Q\)的概率不再玩了,期望為\(Q\times1\)
2.\(1-Q\)的概率第二天接著玩,期望為\((1-Q)\times(E+1)\)


所以\(E=Q+(1-Q)\times(E+1)\),解得\(E=\frac 1Q\)

有點迷,但好像也確實是這樣。。

#include <cstdio>
#include <algorithm>
const int N=105;

double f[N][N];

void Work(int T)
{
    int a,b,n;
    scanf("%d/%d%d",&a,&b,&n);
    double p=1.0*a/b;
    f[0][0]=1;
    for(int i=1; i<=n; ++i)
    {
        f[i][0]=f[i-1][0]*(1-p);
        for(int j=1; j<=i; ++j) f[i][j]=0;//!
        for(int j=1; j*b<=i*a; ++j)
            f[i][j]=f[i-1][j]*(1-p)+f[i-1][j-1]*p;
    }
    double q=0;
    for(int i=0; i*b<=n*a; ++i) q+=f[n][i];
    printf("Case #%d: %d\n",T,(int)(1.0/q));//直接.0lf是四舍五入...
}

int main()
{
    int T; scanf("%d",&T);
    for(int i=1; i<=T; Work(i++));
    return 0;
}

UVA.11427.Expect the Expected(期望)