[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 }