Poj 2096 Collecting Bugs (概率DP求期望)
Time Limit:10000MS Memory Limit:64000KB 64bit IO Format:%I64d & %I64u
Description
Two companies, Macrosoft and Microhard are in tight competition. Microhard wants to decrease sales of one Macrosoft program. They hire Ivan to prove that the program in question is disgusting. However, Ivan has a complicated problem. This new program has s subcomponents, and finding bugs of all types in each subcomponent would take too long before the target could be reached. So Ivan and Microhard agreed to use a simpler criteria --- Ivan should find at least one bug in each subsystem and at least one bug of each category.
Macrosoft knows about these plans and it wants to estimate the time that is required for Ivan to call its program disgusting. It's important because the company releases a new version soon, so it can correct its plans and release it quicker. Nobody would be interested in Ivan's opinion about the reliability of the obsolete version.
A bug found in the program can be of any category with equal probability. Similarly, the bug can be found in any given subsystem with equal probability. Any particular bug cannot belong to two different categories or happen simultaneously in two different subsystems. The number of bugs in the program is almost infinite, so the probability of finding a new bug of some category in some subsystem does not reduce after finding any number of bugs of that category in that subsystem.
Find an average time (in days of Ivan's work) required to name the program disgusting.
Input
Output
Sample Input
1 2
Sample Output
3.0000
题目大意
一个软件有 s 个子系统,存在 n 种 bug。某人一天能找到一个 bug。问,在这个软件中找齐 n 种 bug,
并且每个子系统中至少包含一个 bug 的时间的期望值(单位:天)。注意:bug 是无限多的,每个 bug
属于任何一种 bug 的概率都是 1/n;出现在每个系统是等可能的,为 1/s。
做法分析
令 f[i][j] 表示已经找到了 i 种 bug,且 j 个子系统至少包含一个 bug,距离完成目标需要的时间的期望。
目标状态是 f[0][0]
再过一天找到一个 bug 可能是如下的情况:
1. 这个 bug 的种类是 已经找到的 并且 出现在 已经找到 bug 的子系统中
2. 这个 bug 的种类是 已经找到的 并且 出现在 没有找到 bug 的子系统中
3. 这个 bug 的种类是 没有找到的 并且 出现在 已经找到 bug 的子系统中
4. 这个 bug 的种类是 没有找到的 并且 出现在 没有找到 bug 的子系统中
经过简单的分析,不难得出如下递推过程:
f[i][j] = i/n*j/s*f[i][j]
+ i/n*(s-j)/s*f[i][j+1]
+ (n-i)/n*j/s*f[i+1][j]
+ (n-i)/n*(s-j)/s*f[i+1][j+1]
移项可得
(1-(i*j)/(n*s))f[i][j] = i/n*(s-j)/s*f[i][j+1]
+ (n-i)/n*j/s*f[i+1][j]
+ (n-i)/n*(s-j)/s*f[i+1][j+1]
逆向递推即可
注意这道题输出的是f[0][0],而不是f[1][1]。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
double f[][];
int main()
{
int n,s;
while(scanf("%d%d",&n,&s)!=EOF)
{
memset(f,,sizeof(f));
for(int i=n;i>=;i--)
{
for(int j=s;j>=;j--)
{
if(i==n&&j==s)
continue;
double p1=double(s-j)*i/n/s;
double p2=double(n-i)*j/n/s;
double p3=double(n-i)*(s-j)/n/s;
double p0=1.0-double(i*j)/n/s;
f[i][j]=p1*f[i][j+]+p2*f[i+][j]+p3*f[i+][j+]+; //+1应该是因为要多进行一次所以+1
f[i][j]/=p0;
}
}
printf("%.4f\n",f[][]);
}
return ;
}
Poj 2096 Collecting Bugs (概率DP求期望)的更多相关文章
- poj 2096 Collecting Bugs (概率dp 天数期望)
题目链接 题意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcom ...
- POJ 2096 Collecting Bugs (概率DP,求期望)
Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...
- POJ2096 Collecting Bugs(概率DP,求期望)
Collecting Bugs Ivan is fond of collecting. Unlike other people who collect post stamps, coins or ot ...
- POJ 2096 Collecting Bugs (概率DP)
题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...
- poj 2096 Collecting Bugs 概率dp 入门经典 难度:1
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 2745 Accepted: 1345 ...
- poj 2096 Collecting Bugs - 概率与期望 - 动态规划
Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...
- HDU3853-LOOPS(概率DP求期望)
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Total Su ...
- poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)
Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...
- POJ 2096 Collecting Bugs 期望dp
题目链接: http://poj.org/problem?id=2096 Collecting Bugs Time Limit: 10000MSMemory Limit: 64000K 问题描述 Iv ...
随机推荐
- 基于THINKPHP+layui+Ajax无刷新实现图片上传预览
<fieldset class="layui-elem-field" style="width:500px;margin:50px 0 0 300px;" ...
- stark组件(7):增加分页功能
效果图: 分页部分代码: # 1.分页处理 all_count = self.model_class.objects.all().count() query_params = request.GET. ...
- 裸机——DDR
1.DDR介绍 DDR,是SDRAM的改进,是双通道的SDRAM, SDRAM是同步动态随机访问存储器. SDRAM与SRAM相对于,二者的特点是: SDRAM 需要初始化,使用时许访问,价格便宜. ...
- 计算机指令集CISC与RISC
当接触一新CPU时商家会首先描述它是RISC指令集,这意味着什么,从这个描述你能了解多少CPU特性信息? 复杂指令集计算机(CISC) 长期来,计算机性能的提高往往是通过增加硬件的复杂性来获得.随着集 ...
- android IPC 进程间通讯
参考资料: http://blog.csdn.net/birdsaction/article/details/39451849 在这里我说一下学习技术的方法,别人的博客,别人的东西,再简单,自己没有写 ...
- Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME system variable
编译的时候出现这个,我从svn download下来的代码,运行就报这个错. 当时我还无知的大吼,怎么可能没有配置java_home, 运行了java -version 都显示出来1.8了. 后来,让 ...
- Pascal 基础教程
Pascal现在还有人想学习吗?先给出一本不错的Pascal教程,Object Pascal的教程我日后给出. Pascal基础教程 第一课 初识PASCAL语言 …… ...
- 17、bootStrap组件
1.bootStrap组件 无数可复用的组件,包括字体图标.下拉菜单.导航.警告框.弹出框等更多功能. 2.字体图标 ①不要和其他图标混合使用 ②只能对内容为空的元素起作用 3.下拉菜单 <di ...
- Linux忘记root密码的解决办法
这里以centos6为例: 第一步:先将系统重新启动,在读秒的时候按下任意键就会出现如下图的菜单界面: 第二步:按下『e』就能够进入grub的编辑模式,如图: 第三步:将光标移动到kernel那一行, ...
- day06_01 上节回顾
1.0 extend 扩展方法及"+"的对比 "+"不会改变数组的内容,而extend会改变数组的内容 2.0 sort扩展sorted() a = [1,2, ...