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 ...
随机推荐
- jquery:选择器 过滤器
容易理解错误的地方: 1.假如我们想要让一个表格中第八列的所有单元格,都隐藏起来.我们可能会这么写$("table tr td:eq(8)").css("display& ...
- sublime添加sass编译
首先安装Ruby环境sass是基于ruby的产物,因此在安装sass前需要先安装ruby,如果用命令方式编译Sass也是必须安装ruby的.命令行编译sass见!下载Ruby windows 安装包: ...
- iOS中UDP的使用
// // ViewController.m // UDPDemo // // Created by qianfeng01 on 15-8-13. // Copyright (c) 2015年 ...
- Html简单的整页切换
恩,语言组织不是很好,直接上代码吧.... <!DOCTYPE html> <html> <head lang="en"> <meta c ...
- java变参
java变参是通过数组来实现的 Object[] addAll(Object[] array1, Object... array2)和Object[] addAll(Object[] array1, ...
- eclipse.ini配置文件
Eclipse安装Maven插件后,Eclipse启动问题:Maven Integration for Eclipse JDK Warning. 解决方法: 1. 设置Eclipse使用的JRE为本 ...
- Spark Streaming和Kafka整合开发指南(二)
在本博客的<Spark Streaming和Kafka整合开发指南(一)>文章中介绍了如何使用基于Receiver的方法使用Spark Streaming从Kafka中接收数据.本文将介绍 ...
- centOS解决乱码问题
问题描述:输入javac出现乱码,部分字符不能显示解决方法 echo 'export LANG=en_US.UTF-8' >> ~/.bashrc
- Docker入门系列2 安装
可以从 Docker 社区直接下载可用的模版或镜像. Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多. 其次,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Do ...
- eclipse如何debug调试jdk源码
java是一门开源的程序设计语言,喜欢研究源码的java开发者总会忍不住debug一下jdk源码.虽然官方的jdk自带了源码包src.zip,然而在debug时查看变量却十分麻烦.例如调试HashMa ...