POJ 2096 Collecting Bugs:期望dp
题目链接:http://poj.org/problem?id=2096
题意:
有一个程序猿,他每天都会发现一个bug。
bug共有n个种类。属于某一个种类的概率为1/n。
有s个子系统,每个bug属于一个系统。属于某一个系统的概率为1/s。
问你发现的bug能够覆盖到n个种类和s个系统的期望天数。
题解:
期望dp转移的套路:
倒着推。
利用性质:期望 = ∑ (P(子期望)*φ(子期望))
状态表示:
dp[i][j] = expectation
i:覆盖到i个种类
j:覆盖到j个系统
dp:从当前状态到达目标状态的期望天数(此状态的剩余天数)
如何转移:
套路。先考虑它能够转移到的子期望。
now: dp[i][j]
四种转移:
(1)dp[i][j]:bug的没有覆盖新的区域。概率p0' = (i/n)*(j/s)
(2)dp[i+1][j]:bug为新种类,不是新系统。概率p2 = (n-i)/n * j/s.
(3)dp[i][j+1]:bug不是新种类,是新系统。概率p3 = i/n * (s-j)/s.
(4)dp[i+1][j+1]:既是新种类,又是新系统。概率p4 = (n-i)/n*(s-j)/s
利用期望性质:
dp[i][j] = dp[i][j]*(i/n)*(j/s)
+ dp[i+1][j]*((n-i)/n)*(j/s)
+ dp[i][j+1]*(i/n)*((s-j)/s)
+ dp[i+1][j+1]*((n-i)/n)*((s-j)/s)
+ 1
因为找到一个bug意味着过去了一天,所以dp[i][j]最后要+1。
移项:
dp[i][j] = (dp[i+1][j]*((n-i)/n)*(j/s)
+ dp[i][j+1]*(i/n)*((s-j)/s)
+ dp[i+1][j+1]*((n-i)/n)*((s-j)/s) + 1)
/ (1 - (i/n)*(j/s))
边界条件:
达到目标状态时,剩余天数为0。
dp[n][s] = 0
AC Code:
// state expression:
// dp[i][j] = expectation
// i: found i kinds of bug
// j: in j different sys
//
// find the answer:
// ans = dp[n][s]
//
// transferring:
// dp[i][j] = dp[i][j]*(i/n)*(j/s)
// + dp[i+1][j]*((n-i)/n)*(j/s)
// + dp[i][j+1]*(i/n)*((s-j)/s)
// + dp[i+1][j+1]*((n-i)/n)*((s-j)/s) + 1
//
// dp[i][j] = (dp[i+1][j]*((n-i)/n)*(j/s)
// + dp[i][j+1]*(i/n)*((s-j)/s)
// + dp[i+1][j+1]*((n-i)/n)*((s-j)/s) + 1)
// / (1 - (i/n)*(j/s))
//
// boundary:
// dp[n][s] = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1005
#define MAX_S 1005 using namespace std; int n,s;
double dp[MAX_N][MAX_S]; void read()
{
cin>>n>>s;
} void solve()
{
memset(dp,,sizeof(dp));
for(int i=n;i>=;i--)
{
for(int j=s;j>=;j--)
{
if(i==n && j==s) continue;
double p1=(double)(n-i)/n*j/s;
double p2=(double)i/n*(s-j)/s;
double p3=(double)(n-i)/n*(s-j)/s;
double p0=1.0-(double)i/n*j/s;
dp[i][j]=(dp[i+][j]*p1+dp[i][j+]*p2+dp[i+][j+]*p3+)/p0;
}
}
} void print()
{
printf("%.4f\n",dp[][]);
} int main()
{
read();
solve();
print();
}
POJ 2096 Collecting Bugs:期望dp的更多相关文章
- POJ 2096 Collecting Bugs 期望dp
题目链接: http://poj.org/problem?id=2096 Collecting Bugs Time Limit: 10000MSMemory Limit: 64000K 问题描述 Iv ...
- POJ 2096 Collecting Bugs (概率DP,求期望)
Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...
- Poj 2096 Collecting Bugs (概率DP求期望)
C - Collecting Bugs Time Limit:10000MS Memory Limit:64000KB 64bit IO Format:%I64d & %I64 ...
- poj 2096 Collecting Bugs 概率dp 入门经典 难度:1
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 2745 Accepted: 1345 ...
- poj 2096 Collecting Bugs (概率dp 天数期望)
题目链接 题意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcom ...
- POJ 2096 Collecting Bugs (概率DP)
题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...
- 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 && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP
poj 2096 题目:http://poj.org/problem?id=2096 f[ i ][ j ] 表示收集了 i 个 n 的那个. j 个 s 的那个的期望步数. #include< ...
- poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 3523 Accepted: 1740 ...
随机推荐
- git 安装方法
Windows上安装Git示例 在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可. 安装完成后,在开始菜单里找到“Git”-> ...
- css:选择器
http://blog.csdn.net/xyz121323693/article/details/8516297 交集选择器 并集选择器 后代选择器 子代选择器 http://www.cnblogs ...
- iOS SDK具体解释之UIDevice(系统版本号,设备型号...)
原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK具体解释专栏 blog.csdn.net/column/details/huangwenchen ...
- cenos7 修改hostname
hostnamectl set-hostname Linuxidc 如何在CentOS 7上修改主机名 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵 ...
- caffe--anaconda2--makefile.config--compile --ubuntu16.04
sea@sea-X550JK:/media/sea/wsWin10/wsUbuntu16.04/DlFrames/caffe$ cat Makefile.config: ## Refer to htt ...
- java中类型的隐式转换
byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double
- Android 属性动画框架 ObjectAnimator、ValueAnimator ,这一篇就够了
前言 我们都知道 Android 自带了 Roate Scale Translate Alpha 多种框架动画,我们可以通过她们实现丰富的动画效果,但是这些宽家动画却有一个致命的弱点,它们只是改变了 ...
- emacs 简记
简介 Emacs作为神的编辑器,不用介绍了吧,说点感受. 用了一段时间了,总体感觉其实Emacs是很简单的,甚至比vim还简单,因为在X环境下,打开后可以就像记事本一样使用.但是,使用Emacs的人一 ...
- HDFS源码分析之EditLogTailer
在FSNamesystem中,有这么一个成员变量,定义如下: /** * Used when this NN is in standby state to read from the shared e ...
- PHP中__get()和__set()的用法实例详解
php面向对象_get(),_set()的用法 一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__ge ...