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\n", 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也就是求极限的步骤啦= =,因此可以这样搞下去啦= =。(其实上边的状态不是不可做,可以无限递归,其实就是极限= =,换一种方式设状态就是避免了陷入求极限)

【POJ】2096 Collecting Bugs的更多相关文章

  1. 【POJ】2096 Collecting Bugs(数学期望)

    题目 传送门:QWQ 分析 数学期望 用$ dp[i][j] $表示发现了在$ j $个子系统里面发现了$ i $个bug到$ s $个子系统里面发现了$ n $个bug需要的期望天数. $ dp[0 ...

  2. POJ 2096 Collecting Bugs 期望dp

    题目链接: http://poj.org/problem?id=2096 Collecting Bugs Time Limit: 10000MSMemory Limit: 64000K 问题描述 Iv ...

  3. 【POJ】1704 Georgia and Bob(Staircase Nim)

    Description Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, ...

  4. 【POJ】1067 取石子游戏(博弈论)

    Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  5. poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3523   Accepted: 1740 ...

  6. poj 2096 Collecting Bugs - 概率与期望 - 动态规划

    Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...

  7. POJ 2096 Collecting Bugs

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 1716   Accepted: 783 C ...

  8. poj 2096 Collecting Bugs 概率dp 入门经典 难度:1

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 2745   Accepted: 1345 ...

  9. Poj 2096 Collecting Bugs (概率DP求期望)

    C - Collecting Bugs Time Limit:10000MS     Memory Limit:64000KB     64bit IO Format:%I64d & %I64 ...

随机推荐

  1. 全局压缩http响应头

    见代码: public class CompressAttribute : ActionFilterAttribute { public override void OnActionExecuting ...

  2. siblings 使用

    //$(object).siblings().each(function () { // $(this).find("img").attr("class", & ...

  3. Linux下修改默认字符集--->解决Linux下Java程序种中文文件夹file.isDirectory()判断失败的问题

    一.问题描述: 一个项目中为了生成树状目录,调用了file.listFiles()方法,然后利用file.isDirectory()方法判断是否为目录,该程序在windows下运行无问题,在Linux ...

  4. android 入门-本地化语言

    打包安装到手机上,改变手机系统语言,你在看看是不是改变了.哇.真的可以.

  5. hdu 5033 单调栈 ****

    看出来是单调栈维护斜率,但是不会写,2333,原来是和询问放在一起的 #include <iostream> #include <cstdio> #include <cs ...

  6. 总结列表显示ListView知识点

    全选ListView的item条目 单选ListView的条目 多选ListView的item条目 自定义ArrayAdapter动态改变ListView的不同item样式 动态增加和删除ListVi ...

  7. ADT开发AndroidManifest.xml file missing错误

    一个错误“AndroidManifest.xml file missing”但helloworld目录下有此文件,几番google仍没能解决.想起曾经在网络上看到的一个修复project的办法,抱着死 ...

  8. 写给自己的web开发资源

    web开发给我的感觉就是乱七八糟,而且要学习感觉总是会有东西要学习,很乱很杂我也没空搞,(其实学习这个的方法就是去用它,什么你直接用?学过js么学过jquery么?哈哈,我没有系统的看完过,但是也做出 ...

  9. 智能车学习(十八)——电机学习

    一.C车电机选择 1.摘要:      因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就 ...

  10. Redis在Windows下的安装和使用

    NoSQL简介 介绍redis前,我想还是先认识下NoSQL,即not only sql, 是一种非关系型的数据存储,key/value键值对存储.现有Nosql DB 产品: Redis/Mongo ...