码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2096 Collecting Bugs (概率dp)

时间:2017-07-10 23:46:34      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:double   include   概率   space   思路   turn   存在   pac   ret   

题意:有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)

标签:double   include   概率   space   思路   turn   存在   pac   ret   

原文地址:http://www.cnblogs.com/simplekinght/p/7148026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!