首页 > 代码库 > poj 2096 Collecting Bugs (概率dp)
poj 2096 Collecting Bugs (概率dp)
题意:有s个系统,n种bug,一个程序员每天可以发现一个bug,求发现存在s个系统,n种bug的天数的期望
思路:定义dp[i][j]是已经发现i种bug,j个系统的期望
dp[i+1][j+1] 表示在一个新的系统中发现新bug 它的概率为 (n-i)/n*(s-j)/s
dp[i+1][j] 表示在一个已经发现过的系统中发现了一种新的bug 概率为 (n-i)/n*j/s
dp[i][j+1] 表示在一个新系统中发现一种已经发现过的bug 概率为 i/n*(s-j)/s
dp[i][j] 表示在一个已经发现过的系统中发现一种已经发现过的bug 概率为 i/n*j/s
根据期望的定义 E(aA+bB+cC+dD+...)=aEA+bEB+....;//a,b,c,d...表示概率,A,B,C...表示状态
dp[i][j]=p1*dp[i+1][j+1]+p2*dp[i+1][j]+p3*dp[i][j+1]+p4*dp[i][j]+1
dp[i][j]=(p1*dp[i+1][j+1]+p2*dp[i+1][j]+p3*dp[i][j+1]+1)/(1-p4)
代码:
#include <iostream> #include <cstdio> using namespace std; double dp[1005][1005]; int main() { int n,s; while(cin>>n>>s) { dp[n][s]=0; for(int i=n;i>=0;i--) { for(int j=s;j>=0;j--) { if(i==n&&j==s) continue; double p1=(n-i)*(s-j)/(n*s*1.0); double p2=(n-i)*j/(n*s*1.0); double p3=i*(s-j)/(n*s*1.0); double p4=(i*j)/(n*s*1.0); dp[i][j]=(p1*dp[i+1][j+1]+p2*dp[i+1][j]+p3*dp[i][j+1]+1)/(1.0-p4); } } printf("%.4lf\n",dp[0][0]); } return 0; }
poj 2096 Collecting Bugs (概率dp)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。