POJ P2096 Collecting Bugs

思路


分类讨论,不妨先设$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]);
	}
}

  

  

原文地址:https://www.cnblogs.com/bljfy/p/9332451.html