zoukankan      html  css  js  c++  java
  • 【POJ】2096 Collecting Bugs

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

    题意:s个系统n种bug,每天找出一个bug,种类的概率是1/n,系统的概率是1/s。问:每个系统至少找出一个bug;每种类的bug都被找出。的期望天数(0<n, s<=1000)

    #include <cstdio>
    using namespace std;
    double d[1005][1005];
    int n, s;
    double D;
    int main() {
    	scanf("%d%d", &n, &s);
    	d[s][n]=0;
    	D=s*n;
    	for(int i=s; i>=0; --i) for(int j=n; j>=0; --j) if(!(i==s&&j==n))
    		d[i][j]=((d[i+1][j]*(s-i)*j+d[i][j+1]*i*(n-j)+d[i+1][j+1]*(s-i)*(n-j))/D+1)/(1-i*j/D);
    	printf("%.4f
    ", d[0][0]);
    	return 0;
    }
    

      

    设$d(i, j)$表示已经找到了$i$个系统的bug,$j$种bug还需要的期望天数,显然答案是$d(0, 0)$

    考虑转移:由于$d(i, j)$可以转移到5种子集,且互斥,转移如下:

    1. 权为1,概率为1。(表示今天找到的bug)
    2. 权为$d(i, j)$,概率为$i*j/s/n$。(表示由找到了一个旧系统且是旧种类的bug的状态转移过来)
    3. 权为$d(i+1, j)$,概率为$(s-i)*j/s/n$。(表示由找到了一个新系统但是是旧种类的bug的状态转移过来)
    4. 权为$d(i, j+1)$,概率为$i*(n-j)/s/n$。(表示由找到了一个旧系统但是是新种类的bug的状态转移过来)
    5. 权为$d(i+1, j+1)$,概率为$(s-i)*(n-j)/s/n$。(表示由找到了一个新系统且新种类的bug的状态转移过来)

    发现是不是和一般的dp不同了呢?转移中有自己!哈哈,这就是期望dp的精髓所在= =

    那么我们可以移项了= =(这样就不会无限递归,体现了数学的奥秘= =)最后得到:

    $$d(i, j) = (ijd(i, j)+(s-i)jd(i-1, j)+i(n-j)d(i, j-1)+(s-i)(n-j)d(i-1, j-1)+1)/(n*s)/(1-ij/(n*s))$$

    可能你会说,为什么要设“还需要的期望天数”而不是“转移到当前状态的期望天数”呢?因为在自己对自己的转移中,假设那样设状态的话,答案显然是$d(s, n)$对吧,可是你会发现转移方程除数变成0了!因此状态转移不过来...

    而前者由于初始状态显然是$d(s, n)=0$,就不会出现除数为0也就是求极限的步骤啦= =,因此可以这样搞下去啦= =。(其实上边的状态不是不可做,可以无限递归,其实就是极限= =,换一种方式设状态就是避免了陷入求极限)

  • 相关阅读:
    vue / js使用video获取视频时长
    vuex的使用
    eclipse中没有tomcat小猫
    Windows下安装Redis服务
    postman上传文件对参数的contentType类型设置方式
    !与&&优先级的问题
    备份数据库中的某个表的数据报错Statement violates GTID consistency
    Error 'Cannot add or update a child row: a foreign key constraint fails故障解决
    解除项目与其他服务的强依赖
    常见的几种异常类型 Exception
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4296398.html
Copyright © 2011-2022 走看看