POJ 2096 Collecting Bugs[数学期望]

  为了理解期望DP做的第一道期望题。

  一共有s个子系统和n个bug,一次能找一个Bug,求出在s个子系统中发现n个Bug的期望次数。bug是无穷的,所以认为每次在每个系统找找到一个Bug的概率是相等的。

  这种题目基本都是设E(now)为从当前状态到达结束状态的期望,E(now)=∑E(x)p(x),x表示可以从now转移到的状态,p[x]表示转移到这个状态的概率。

 1 /*
 2 s个子系统,n个bug,
 3 e[i][j],在i个子系统中发现j个bug到达目标的期望,显然d[s][n]=0;
 4 e[i][j]可以转化成四种情况
 5 发现无用的bug             e[i][j]*(i/s)*(j/n)
 6 在一个新系统中发现新bug   e[i+1][j+1]*(1-i/s)*(1-j)/n)
 7 在一个新系统中发现旧bug   e[i+1][j]*(1-i/s)*(j/n)
 8 在一个旧系统中发现新bug   e[i][j+1]*(i/s)*(1-j/n)
 9 加起来 e[i][j]=e[i][j]*(i*j)/(s*n)+....+1
10 移项   e[i][j]=(...+1)/(1-(i*j)/(s*n))
11 最后d[0][0]即为所求
12 */
13 #include <string.h>
14 #include <stdio.h>
15 double e[1005][1005],div;
16 int n,s;
17 int main(){
18     while(scanf("%d%d",&n,&s)!=EOF){
19         e[s][n]=0,div=n*s;
20         for(int i=s;i>=0;i--){
21             for(int j=n;j>=0;j--){
22                 if(i==s&&j==n)continue;
23                 e[i][j]=(((s-i)*(n-j)*e[i+1][j+1]+(s-i)*j*e[i+1][j]+(n-j)*i*e[i][j+1])/div+1)/(1-i*j/div);
24             }
25         }
26         printf("%.4f\n",e[0][0]);
27     }
28     return 0;
29 }

 

原文地址:https://www.cnblogs.com/swm8023/p/2664927.html