POJ 2096 (概率DP)
题目链接: http://poj.org/problem?id=2096
题目大意:n种bug,s个子系统。每天随机找一个bug,种类随机,来自系统随机。问找齐n种bug,且每个子系统至少有一个bug的期望天数。
解题思路:
- -。题目像一坨屎。
其中"且每个子系统至少有一个bug"比较坑爹,其实意思就是找出s个bug就行了。
dp[i][j]表示已找到i种bug,且j个系统有bug的期望。
它可以由四个状态推到:
①dp[i][j], 当前找的bug,种类重复,且系统重复。概率为(i/n)*(j/s)。
②dp[i][j-1],当前找的bug,种类重复,且系统不重复。概率(i/n)*(s-j)/s。
③dp[i-1][j],当前找的bug,种类不重复,且系统重复。概率(n-i)/n*(j/s)。
④dp[i-1][j-1],当前找的bug,种类不重复,且系统不重复。概率为(n-i)/n*(s-j)/s。
最后dp[i][j]+=1.
由于是求期望,所以要逆推,dp[n][s]=0, ans=dp[0][0] 。
dp方程的减号全部改为加号。累加然后你会WA掉。因为double精度丢失太严重了。
dp[i][j]*(i/n)*(j/s)。几次乘几次除,精度会爆。
所以有必要进行化简, 把乘法化在一起,除法化在一起,最后做一步除法。
dp[i,j] = ( 1 + p2*dp[i+1,j] + p3*dp[i,j+1] + p4*dp[i+1,j+1] )/( 1-p1 )
= ( n*s + (n-i)*j*dp[i+1,j] + i*(s-j)*dp[i,j+1] + (n-i)*(s-j)*dp[i+1,j+1] )/( n*s - i*j )
由于POJ数据略水,其实化简到第一步就能A。
#include "cstdio"
#include "cstring"
double dp[][];
int main()
{
int n,s;
while(scanf("%d%d",&n,&s)!=EOF)
{
memset(dp,,sizeof(dp));
for(int i=n;i>=;i--)
{
for(int j=s;j>=;j--)
{
if(i==n&&j==s) continue;
double p2=(double(s-j)*i)/n/s;
double p3=(double(n-i)*j)/n/s;
double p4=(double(n-i)*(s-j))/n/s;
double p1=1.0-(double(i*j))/n/s;
dp[i][j]=p2*dp[i][j+]+p3*dp[i+][j]+p4*dp[i+][j+]+;
dp[i][j]/=p1;
}
}
printf("%.4lf\n",dp[][]);
}
}
13634810 | neopenx | 2096 | Accepted | 8056K | 719MS | C++ | 679B | 2014-11-16 16:08:41 |
POJ 2096 (概率DP)的更多相关文章
- poj - 2096 概率dp (找bug)
题意:一个人一天只能找1个bug ,这个bug属于s个子系统中的某一个子系统,属于n种bug 中的某一种 ,求 这个人找出n种bug ,并且s个系统都bug的期望 (每个系统的一定可以找出bug) 一 ...
- POJ 2151 概率DP
主要的子问题是每一个队伍有一个做出题目的概率,求做出k个题目的概率.简单的简单的组合数DP.想清楚即可. 1: #include <iostream> 2: #include <cs ...
- POJ 3701 概率DP
给定2^n 支足球队进行比赛,n<=7. 队伍两两之间有一个获胜的概率,求每一个队伍赢得最后比赛的概率是多少? 状态其实都是很显然的,一开始觉得这个问题很难啊,不会.dp[i][j] 表示第i支 ...
- Scout YYF I POJ - 3744(概率dp + 矩阵快速幂)
题意: 一条路上有n个地雷,你从1开始走,单位时间内有p的概率走一步,1-p的概率走两步,问安全通过这条路的概率 解析: 很容易想到 dp[i] = p * dp[i-1] + (1 - p) * d ...
- poj 3071 概率dp
转自:cxlove 题目:有2^n个队,相邻的两两打淘汰赛,,求最后哪个队夺冠的概率最大 dp[i][j]表示第i轮的时候,第j去支队伍赢的概率. 那么dp[i][j]的前提就是i-1轮的时候,j是赢 ...
- poj 3744 概率dp+矩阵快速幂
题意:在一条布满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问 ...
- Check the difficulty of problems - poj 2151 (概率+DP)
有 T(1<T<=1000) 支队伍和 M(0<M<=30) 个题目,已知每支队伍 i 解决每道题目 j 的的概率 p[i][j],现在问:每支队伍至少解决一道题,且解题最多的 ...
- poj 2151 概率DP(水)
Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5750 ...
- poj 3744 概率dp 快速幂 注意排序 难度:2
/* Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5304 Accepted: 1455 De ...
随机推荐
- Android -- android:configChanges
原文:http://jingyan.baidu.com/article/2fb0ba4056b25700f2ec5faf.html 从Android 3.2(API 13),如果你想阻止程序在运行时重 ...
- openfire 服务器名称:后面的黄色叹号
然后点击重新获取证书,然后重新启动服务,问题解决!
- Linux下Vi/Vim使用笔记
启动和关闭vim vi 打开 Vi/Vim 打开 Vi/Vim 并加载文件 <file> vi <file> vim编辑器的三种模式:一般模式.编辑模式和命令行模式在一般模式中 ...
- 回溯法解决N皇后问题(以四皇后为例)
以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...
- 攻城狮在路上(壹) Hibernate(八)--- 映射Hibernate组成关系
一.使用组成关系的原则: 在不导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系,因为建立多个表的连接是很耗时的操作. 举例说明:Customer类中的Address属性,可以通过组 ...
- [J2EE] 在Web如何取得相关路径
来自网络,自己整整一下: request.getRealPath("url"); // 虚拟目录映射为实际目录,不建议使用,使用ServletContext.getRealPath ...
- linux使用读写锁pthread_rwlock_t
转自:http://blog.csdn.net/onlyou930/article/details/6755593 使用读写锁 配置读写锁的属性之后,即可初始化读写锁.以下函数用于初始化或销毁读写锁. ...
- 物化视图刷新慢--有可能是mv log被多个mv使用造成的
同事说物化视图刷新慢,经检生产环境,发现部分物化视图刷新慢的原因是:由于同一个物化视图日志(mv log)被多个物化视图(mv)使用,不同的物化视图(mv)使用不同的刷新间隔,导致物化视图日志(mv ...
- Android图像处理实例教程
Android图像处理实例教程 原始出处 http://vaero.blog.51cto.com/4350852/856750
- HDU 5919 Sequence II 主席树
Sequence II Problem Description Mr. Frog has an integer sequence of length n, which can be denoted ...