【POJ2096】Collecting Bugs

题意

   有s个系统,n种bug,小明每天找出一个bug,可能是任意一个系统的,可能是任意一种bug,即是某一系统的bug概率是1/s,是某一种bug概率是1/n。 求他找到s个系统的bug,n种bug,需要的天数的期望。

分析

  题意很难懂··真的很难懂···

  基础的概率dp。

  令f[i][j]为当前已经找出i种bug,j个系统的,要到达目标状态(n,s)的期望天数。显然f[n][s]=0;

  考虑一下状态的转移

      1.转移到[i+1][j]的概率为(n-i)/n*j/s

      2.转移到[i][j+1]的概率为i/n*(s-j)/s

      3.转移到[i+1][j+1]的概率为(n-i)/n*(s-j)/s

      4.转移到[i][j]的概率为i/n*j/s

f[i][j]=(n-i)/s*j/s*f[i+1][j]+i/n*(s-j)/s*f[i][j+1]+f[i+1][j+1]*(n-i)/n*(s-j)/s+f[i][j]*i/n*j/s

移一下项

(1-i/n*j/s)*f[i][j]=(n-i)/s*j/s*f[i+1][j]+i/n*(s-j)/s*f[i][j+1]+f[i+1][j+1]*(n-i)/n*(s-j)/s

然后把左边的除过去得

f[i][j]=((n-i)/s*j/s*f[i+1][j]+i/n*(s-j)/s*f[i][j+1]+f[i+1][j+1]*(n-i)/n*(s-j)/s)/(1-i/n*j/s)

然后整理一下得

f[i][j]=(f[i+1][j]*(n-i)*j+f[i][j+1]*(s-j)*i+f[i+1][j+1]*(n-i)*(s-j)+n*s)/(n*s-i*j);

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 const int maxn=1000+100;
 8 double f[maxn][maxn];
 9 int n,s;
10 
11 int main(){
12     while(scanf("%d%d",&n,&s)!=EOF){
13         memset(f,0,sizeof(f));
14         for(int i=n;i>=0;i--){
15             for(int j=s;j>=0;j--){
16                 if(i==n&&j==s)
17                  continue;
18                 f[i][j]=(f[i+1][j]*(n-i)*j+f[i][j+1]*(s-j)*i+f[i+1][j+1]*(n-i)*(s-j)+n*s)/(n*s-i*j);
19                // f[i][j]=(f[i+1][j]*(double)(n-i)*j/(n*s)+f[i][j+1]*(double)i*(s-j)/(s*n)+f[i+1][j+1]*(n-i)*(s-j)/(n*s))/(1-(double)i/n*(double)j/s);
20             }
21         }
22         printf("%.4f\n",f[0][0]);
23     }
24 return 0;
25 }
View Code

猜你喜欢

转载自www.cnblogs.com/LQLlulu/p/9095979.html
今日推荐