【POJ】2096 Collecting Bugs(数学期望)

题目

传送门:QWQ

分析

数学期望

用$ dp[i][j] $表示发现了在$ j $个子系统里面发现了$ i $个bug到$ s $个子系统里面发现了$ n $个bug需要的期望天数。

$ dp[0][0] $就是答案。

然后分类一下,可以转移到$ dp[i][j] $无非就是$ dp[i+1][j+1] $ $ dp[i][j+1] $ $ dp[i+1][j] $ $ dp[i][j] $

各自分别算一下概率,比如从$ dp[i][j] $转移过来的话概率是$ frac{i}{n} imes frac{j}{s} $因为这天要刚好落在已经选择过的$ i $个bug和$ j $个子系统里。

其他的也差不多。

   

代码

由于日常include <bits/stdc++.h>所以poj的ce数量超级多。。。。。

 1 // #include <bits/stdc++.h>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int maxn=1050;
 6 double dp[maxn][maxn];
 7 int main(){
 8     double n,s; scanf("%lf%lf",&n,&s);
 9     memset(dp,0,sizeof(dp));
10     for(int i=n;i>=0;i--)
11         for(int j=s;j>=0;j--){
12             if(i==n&&j==s) continue;
13             double p1=i*j/n/s,p2=i*(s-j)/n/s,p3=(s-j)*(n-i)/n/s,p4=(n-i)*j/n/s;
14             dp[i][j]=(1+p2*dp[i][j+1]+p3*dp[i+1][j+1]+p4*dp[i+1][j])/(1-p1);
15         }
16     printf("%.5f
",dp[0][0]);
17     return 0;
18 }
原文地址:https://www.cnblogs.com/noblex/p/9406589.html