zoukankan      html  css  js  c++  java
  • POJ 2096:Collecting Bugs 概率DP求期望

    Collecting Bugs

    题目链接:

    http://poj.org/problem?id=2096

    题意:

    Ivan喜欢收集bug,他每天都会找到一个bug,找到的这个bug有一种属性并且属于一个子系统,bug共有n种属性,子系统共有s个 (0<n, s≤1000),求Ivan集齐了n种bug且每个子系统都有bug的期望。

    题解:

    第一道求期望的题,令dp[i][j]表示系统已经有了i个系统的全部j种bug并且要得到所有bug的天数的期望,因此dp[n][s]=0,而dp[0][0]则是所求答案。

    dp[i][j]到下一天会有四种情况dp[i][j](找到了一个已有的bug且bug所属的子系统已有bug),dp[i+1][j](找到了一个新bug但bug所属的子系统已有bug),dp[i][j+1](找到了一个已有的bug但是bug存在的系统在此之前还没有bug),dp[i+1][j+1](找到了一个新bug且bug所属的子系统在此之前还没有bug)。

    得到这四种情况的概率分别为:

              p1=i*j/(n*s);

              p2=(n-i)*j/(n*s);

              p3=i*(s-j)/(n*s);

              p4=(n-i)*(s-h)/(n*s);

    由期望的线性性质可以知道dp[i][j]=p1*dp[i][j]+p2*dp[i+1][j]+p3*dp[i][j+1]+p4*dp[i+1][j+1];由于是下一天,所以dp[i][j]还要加上1。

                  

    代码

    #include<stdio.h>
    const int N=1002;
    double dp[N][N],p1,p2,p3,p4,ns;
    int main()
    {
    	int n,s;
    	while(~scanf("%d%d",&n,&s))
    	{
    		ns=n*s;
    		dp[n][s]=0.0;
    		for(int i=n;i>=0;--i)
    		for(int j=s;j>=0;--j)
    		if(i!=n||j!=s)
    		{
    			p1=i*j/(ns);
    			p2=(n-i)*j/(ns);
    			p3=i*(s-j)/(ns);
    			p4=(n-i)*(s-j)/(ns);  
    			dp[i][j]=(1.0+p2*dp[i+1][j]+p3*dp[i][j+1]+p4*dp[i+1][j+1])/(1.0-p1);
    		}printf("%.4f
    ",dp[0][0]);
    	}
    }

      

  • 相关阅读:
    Linux随笔 DNS搭建
    总算亲自看见了一个网站被黑后的页面。
    [转]XP如何禁止媒体文件预览
    用Word2007发Blog的配置方法(多图)。
    C#通过http访问olap
    测试Word2007
    用IronPython作为.Net的脚本语言。
    用批处理写的显示磁盘剩余空间的小程序。
    事开机时Num Lock键打开。
    快捷方便的对js文件进行语法检查。
  • 原文地址:https://www.cnblogs.com/kiuhghcsc/p/5557483.html
Copyright © 2011-2022 走看看