为了理解期望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 }