POJ2096题解(期望dp)

POJ2096题解

题意

1.有无数个bug
2.将无数个bug分为n种,s类
3.期望意义上,多少天能至少在n种s类里都找到一个bug

笺释

这道题和HDU4336很像。

原子操作(Atom Operation)为每天找出一个bug,这个bug:
有可能是已找出的i种bug中的一种,这个概率为i/n
有可能是已找出的j类bug中的一类,这个概率为j/s

和4336的区别在于那道题需要记录i张卡里哪几张拿过了哪几张没拿,但是这道题只需要知道目前已经拿了i张卡,不太好从一个广泛性的原理角度解释为什么,只能靠自己体会了。
(摸了)

完整代码

#include
#include
#define MAXN 1005
int s,n;
double dp[MAXN][MAXN];
int main()
{
    while(~scanf("%d %d",&n,&s))
    {
        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;
                }
                double p1=((double)i/n)*((double)j/s);
                double p2=((double)i/n)*(1-(double)j/s);
                double p3=(1-(double)i/n)*((double)j/s);
                double p4=(1-(double)i/n)*(1-(double)j/s);
                //printf("%d %d %f %f %f %f\n",i,j,p1,p2,p3,p4);
                dp[i][j]=((dp[i][j+1]*p2+dp[i+1][j]*p3+dp[i+1][j+1]*p4)+1)/(1-p1);
            }
        }
        printf("%.4f\n",dp[0][0]);
    }
}

你可能感兴趣的:(概率dp)