POJ 2096 Collecting Bugs(概率DP求期望)

入门题,题意:有n种bug,有s个子系统,bug有无穷多个,一个人每天能找出一个bug,bug出现的概率一样即1/n,在子系统出现的概率也是一样的1/s,要求找出每种bug至少在每个子系统都出现的期望(天数)。

设dp[i][j]表示i种bug在j种子系统出现到目标状态所需的天数,那么有:

当找到一个bug时,有4种情况:

1、这种bug已经找到过,这种bug在j种子系统中出现过;

2、这种bug已经找到过,这种bug在j种子系统中没有出现过;

3、这种bug还没有找到过,这种bug在j种子系统中出现过;

4、这种bug还没有找到过,这种bug在j种子系统中没有出现过;

于是有:

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

化简得:

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

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>

#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;

const int inf=0x7ffffff;
const double PI=acos(-1.0);
const double eps=1e-8;
const double e=2.7182818284590452354;

double dp[1010][1010];

int main()
{
	int n,s;
	while(~scanf("%d%d",&n,&s))
	{
		mm(dp,0);
		double p1=1.0/s;
		double p2=1.0/n;
		for(int i=n;i>=0;i--)
			for(int j=s;j>=0;j--)
			{
				if(i==n && j==s) continue;
				dp[i][j]=(i*p1*(s-j)*p2*dp[i][j+1]
					+(n-i)*p1*j*p2*dp[i+1][j]
					+(n-i)*p1*(s-j)*p2*dp[i+1][j+1]+1)/(1-i*p1*j*p2);
			}
		printf("%.4lf\n",dp[0][0]);
	}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值