思路
分类讨论,不妨先设$DP[i][j]$表示已经发现$i$种子系统中有$n$种$bug$无非只有四种情况
- 发现的$bug$在旧的系统旧的分类,概率$p1$是$(i/s)*(j/n)$.
- 发现的$bug$在旧的系统新的分类,概率$p2$是$(i/s)*((n-j)/n)$
- 发现的$bug$在新的系统旧的分类,概率$p3$是$((s-i)/s)*(j/n)$
- 发现的$bug$在新的系统新的分类,概率$p4$是$((s-i)/s)*((n-j)/n)$
- 那么我们很自然的就得到了下面的转移方程
$$dp[i][j] = p1*dp[i][j]+p2*dp[i][j+1]+p3*dp[i+1][j]+p4*dp[i+1][j+1]$$
代码
#include <iostream> #include <cstdio> #include <cstring> const int maxn = 1010; using namespace std; int n, s; double dp[maxn][maxn], p1, p2, p3, p4; int main() { while (scanf("%d%d", &n, &s) == 2) { memset(dp,0,sizeof(dp)); for(int i=n; i>=0; --i) { for(int j=s; j>=0; --j) { if(i==n&&j==s)continue; p1=1.0*i/n*j/s; p2=1.0*(n-i)/n*j/s; p3=1.0*i/n*(s-j)/s; p4=1.0*(n-i)/n*(s-j)/s; dp[i][j]=(p2*dp[i+1][j]+p3*dp[i][j+1]+p4*dp[i+1][j+1]+1.0)/(1.0-p1); } } printf("%.4f ",dp[0][0]); } }