POJ 2096 Collecting Bugs (概率DP入门)
2015-07-10 23:32
417 查看
今天看了kuangbin博客里的概率DP总结/content/3596333.html
开始的一句话感觉很有道理(概率正推,期望逆推)【不过谁能给我详细讲一下,现在只是感觉上很有道理
设dp[i][j]为已找到i种bug和j个subconponent后到达目标的期望。
那么dp[i][j] 可以转化成四种状态:
dp[i][j] + 1 概率:i*j / n / s
dp[i+1][j] + 1 概率: (n-i)*j / n / s
dp[i][j+1] + 1 概率:i*(s-j) / n / s
dp[i+1][j+!] + 1 概率: (n-i)*(s-j) / n / s
代码:
开始的一句话感觉很有道理(概率正推,期望逆推)【不过谁能给我详细讲一下,现在只是感觉上很有道理
设dp[i][j]为已找到i种bug和j个subconponent后到达目标的期望。
那么dp[i][j] 可以转化成四种状态:
dp[i][j] + 1 概率:i*j / n / s
dp[i+1][j] + 1 概率: (n-i)*j / n / s
dp[i][j+1] + 1 概率:i*(s-j) / n / s
dp[i+1][j+!] + 1 概率: (n-i)*(s-j) / n / s
代码:
#include<cstdio> #include<iostream> using namespace std; const int maxn = 1005; int n,s; double dp[maxn][maxn]; int main(){ scanf("%d%d",&n,&s); for(int i = n ;i >= 0; i--){ for(int j = s; j >= 0; j--){ if(i == n && j == s) continue; dp[i][j] = (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); } } printf("%.4f\n",dp[0][0]); return 0; }
相关文章推荐
- LeetCode155:Min Stack
- 越狱资料
- 2015071005 - 明天去盘山
- iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)
- 【SVN Working copy is too old (format 10, created by Subversion 1.6)】解决方案
- 2015071004 - 和过去一刀两断
- 读《一个程序猿的生命周期》有感
- 值得珍藏的28本股市投资经典著作
- HDU 4788 Hard Disk Drive
- 值得珍藏的28本股市投资经典著作
- Foundation框架-08 集合对象的内存管理
- 在CentOS上安装Java环境
- 使用OutPutStream写数据的问题及其它
- JQuery入门——进度条
- 实时监听输入框值变化的完美方案:oninput & onpropertychange
- 关于Boost库和STL标准模板库
- java中的IO流
- UVA 10815 Andy's First Dictionary
- 2015071003 - 烦躁
- iOS中MVC常用的结构策略