poj 2096 Collecting Bugs(概率dp入门)
2013-08-21 17:15
176 查看
逆着递推求解
题意:(题意看题目确实比较难道,n和s都要找半天才能找到)
一个软件有s个子系统,会产生n种bug
某人一天发现一个bug,这个bug属于一个子系统,属于一个分类
每个bug属于某个子系统的概率是1/s,属于某种分类的概率是1/n
问发现n种bug,每个子系统都发现bug的天数的期望。
求解:
dp[i][j]表示已经找到i种bug,j个系统的bug,达到目标状态的天数的期望
dp
[s]=0;
要求的答案是dp[0][0];
dp[i][j]可以转化成以下四种状态:
dp[i][j],发现一个bug属于已经有的i个分类和j个系统。概率为(i/n)*(j/s);
dp[i][j+1],发现一个bug属于已有的分类,不属于已有的系统.概率为 (i/n)*(1-j/s);
dp[i+1][j],发现一个bug属于已有的系统,不属于已有的分类,概率为 (1-i/n)*(j/s);
dp[i+1][j+1],发现一个bug不属于已有的系统,不属于已有的分类,概率为 (1-i/n)*(1-j/s);
整理便得到转移方程
题意:(题意看题目确实比较难道,n和s都要找半天才能找到)
一个软件有s个子系统,会产生n种bug
某人一天发现一个bug,这个bug属于一个子系统,属于一个分类
每个bug属于某个子系统的概率是1/s,属于某种分类的概率是1/n
问发现n种bug,每个子系统都发现bug的天数的期望。
求解:
dp[i][j]表示已经找到i种bug,j个系统的bug,达到目标状态的天数的期望
dp
[s]=0;
要求的答案是dp[0][0];
dp[i][j]可以转化成以下四种状态:
dp[i][j],发现一个bug属于已经有的i个分类和j个系统。概率为(i/n)*(j/s);
dp[i][j+1],发现一个bug属于已有的分类,不属于已有的系统.概率为 (i/n)*(1-j/s);
dp[i+1][j],发现一个bug属于已有的系统,不属于已有的分类,概率为 (1-i/n)*(j/s);
dp[i+1][j+1],发现一个bug不属于已有的系统,不属于已有的分类,概率为 (1-i/n)*(1-j/s);
整理便得到转移方程
#include<cstdio> #include<iostream> #include<string.h> #include<math.h> using namespace std; #define N 1005 double dp ; int main() { int i,j; double n,s; while(~scanf("%lf%lf",&n,&s)) { memset(dp,0,sizeof(dp)); for(i=n;i>=0;i--) { for(j=s;j>=0;j--) { if(i==int(n)&&j==int(s)) continue; dp[i][j]+=dp[i][j+1]*i*(s-j)/n/s; dp[i][j]+=dp[i+1][j]*j*(n-i)/s/n; dp[i][j]+=dp[i+1][j+1]*(s-j)*(n-i)/s/n; dp[i][j]++; dp[i][j]=dp[i][j]/(1-i*j/n/s); } } printf("%.4lf\n",dp[0][0]); } return 0; }
相关文章推荐
- poj2096Collecting Bugs【概率dp入门题求期望】
- POJ 3071 Football 概率DP入门
- POJ 2096 Collecting Bugs (概率DP经典入门题)
- HDU 3853-loop(概率dp入门)
- 概率dp入门
- POJ 2151 Check the difficulty of problems 概率DP入门
- 概率dp入门12/14
- zoj 3822 概率期望dp入门
- 【概率DP入门】
- SGU 495 Kids and Prizes (概率DP入门)
- HDU 3853 LOOPS 概率dp入门 (1)
- poj 2096 (概率DP入门)
- 概率dp入门
- HDU 3076 ssworld VS DDD 概率DP入门
- 概率DP入门
- 【概率DP入门】
- ZOJ 3822 Domination 概率DP入门
- POJ 2096-Collecting Bugs(概率dp入门)
- 概率DP【入门】
- 青岛理工大学第五届邀请赛 J: 麻烦的转盘(概率DP入门题)