[POJ 2096] Collecting Bugs

一个程序有无限个bugs,一天可以找到1个,这些bugs有两个不同关键字A,B,分别按这两个关键字被分成了n种和m种,求集齐所有类(召唤神龙)的期望天数

设dp[i][j]表示已经收集了i种A和j种B的期望天数

dp[i][j]=i/n*j/s*dp[i][j]+p

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

移项得dp[i][j]=p*n*s/(n*s-i*j)

 当n*s=i*j时狗带

ans=dp[0][0]

深刻体会到了kuangbin大爷说的求期望多逆推QAQ

 1 #include<cstdio>
 2 using namespace std;
 3 #define maxn 1005
 4 double dp[maxn][maxn];
 5 int main(){
 6     int n,s;
 7     while(scanf("%d%d",&n,&s)!=EOF){
 8         dp[n][s]=0;
 9         for(int i=n;i>=0;i--)
10             for(int j=s;j>=0;j--){
11                 if(n*s==i*j)continue;
12                 dp[i][j]=dp[i+1][j]*(n-i)/n*j/s+dp[i][j+1]*i/n*(s-j)/s+dp[i+1][j+1]*(n-i)/n*(s-j)/s+1;
13                 dp[i][j]*=1.0*n*s/(n*s-i*j);
14             }
15         printf("%.4lf\n",dp[0][0]);
16     }
17     return 0;
18 }
View Code

 

posted @ 2016-05-23 12:40  Ngshily  阅读(194)  评论(0编辑  收藏  举报