題意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 }