UVA11427概率期望+独立重复事件

 1 /*UVA11427*/
 2 /*概率期望:
 3 独立重复事件A(p,n):
 4 p:一件事情发生的概率为p
 5 n:最多重复n次
 6 要求:1、q=成功次数/实验次数>p 结束实验;
 7 所求:n次实验后,q一直小于等于p
 8 
 9 初始思考:
10 ans=1-补集;
11 补集=p+(1-p)*p......这样不好控制,因为无法手动枚举出所有的情况
12 
13 优化:
14 dp(i,j):发生i次实验,没有达成跳出条件,且发生了j次成功的概率
15 dp(i,j)=d(i-1,j-1)*p+dp(i-1,j)*(1-p) 满足j/i<=p;
16 p(A)=d(n,0)+d(n,1)+d(n,2)+d(n,3).....+d(n,i) i/n<=p
17 ans=1/p(A)
18 
19 边界 :
20 memset(dp,0);
21 dp(0,0)=1;
22 
23 
24 */
25 #include<iostream>
26 #include<stdio.h>
27 #include<string.h>
28 #include<algorithm>
29 #include<stdlib.h>
30 #include<math.h>
31 #include<queue>
32 #include<vector>
33 #include<map>
34 
35 using namespace std;
36 
37 double dp[105][105];
38 int main()
39 {
40     int t,pi,pj,n;
41     double p;
42     cin>>t;
43 
44     for(int cas=1;cas<=t; cas++)
45     {
46         scanf("%d/%d %d",&pi,&pj,&n);
47         p=(pi+0.0)/pj;
48         memset(dp,0,sizeof(dp));
49         dp[0][0]=1.0;
50         for(int i=1;i<=n;i++)
51         {
52             for(int j=0;j*pj<=pi*i;j++)//保证j/i<=pi/pj,这是一种技巧
53             {
54                 dp[i][j]=dp[i-1][j]*(1-p);
55                 if(j-1>=0) dp[i][j]+=dp[i-1][j-1]*p;
56             }
57         }
58         double pAns=0;
59         for(int j=0;j*pj<=pi*n;j++) pAns+=dp[n][j];
60         printf("Case #%d: %d
",cas,(int)(1/pAns));
61 
62     }
63     return 0;
64 }
原文地址:https://www.cnblogs.com/little-w/p/3570252.html