【POJ2096】Collecting Bugs

 

題意ios

   有s個系統,n種bug,小明天天找出一個bug,多是任意一個系統的,多是任意一種bug,便是某一系統的bug機率是1/s,是某一種bug機率是1/n。 求他找到s個系統的bug,n種bug,須要的天數的指望。ide

分析spa

  題意很難懂··真的很難懂···code

  基礎的機率dp。blog

  令f[i][j]爲當前已經找出i種bug,j個系統的,要到達目標狀態(n,s)的指望天數。顯然f[n][s]=0;string

  考慮一下狀態的轉移it

      1.轉移到[i+1][j]的機率爲(n-i)/n*j/sio

      2.轉移到[i][j+1]的機率爲i/n*(s-j)/sevent

      3.轉移到[i+1][j+1]的機率爲(n-i)/n*(s-j)/sclass

      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
相關文章
相關標籤/搜索