UVa 11427 (期望 DP) Expect the Expected

设d(i, j)表示前i局每局获胜的比例均不超过p,且前i局共获胜j局的概率。

d(i, j) = d(i-1, j) * (1-p) + d(i-1, j-1) * p

则只玩一天就就不再玩的概率Q = sum{d(n, i) | 0 ≤ i ≤ p*n}

那么期望为

这是一个无穷级数,可以用高数的一些知识来解决。

另1-Q = t

 将1-Q带入t,并将左边的Q乘过去得:

 

书上还介绍了一种更简单的方法,假设所求期望为e

第一天玩完就去睡觉,概率为Q,期望为1;第一天玩得高高兴兴,概率为1-Q,期望为1+e

于是有等式:e = Q + (1-Q)(1+e)

 1 #include <cstdio>
 2 #include <cstring>
 3 const int maxn = 100 + 10;
 4 
 5 double d[maxn][maxn];
 6 
 7 int main()
 8 {
 9     //freopen("in.txt", "r", stdin);
10 
11     int T;
12     scanf("%d", &T);
13     for(int kase = 1; kase <= T; kase++)
14     {
15         int n, a, b;
16         scanf("%d/%d%d", &a, &b, &n);
17         double p = (double)a / b;
18         memset(d, 0, sizeof(d));
19         d[0][0] = 1; d[0][1] = 0;
20         for(int i = 1; i <= n; i++)
21             for(int j = 0; j*b <= a*i; j++)
22             {
23                 d[i][j] = d[i-1][j]*(1-p);
24                 if(j) d[i][j] += d[i-1][j-1]*p;
25             }
26 
27         double Q = 0;
28         for(int i = 0; i*b <= a*n; i++) Q += d[n][i];
29         printf("Case #%d: %d\n", kase, (int)(1/Q));
30     }
31 
32     return 0;
33 }
代码君

 

posted @ 2015-03-11 19:38  AOQNRMGYXLMV  阅读(153)  评论(0编辑  收藏  举报