POJ 2096(概率DP)
2016-02-24 16:48
225 查看
题目链接:POJ 2096
解题思路:
总的来说状态方程还是蛮好想的,每次找bug的时候,有可能会出现四种情况,一是在已经找到bug的系统中找到了旧bug,二是在新的系统中找到旧bug,三是在已经找到bug的系统中找到了新bug,二是在新的系统中找到新bug。于是,状态dp[i][j]表示在 j 个系统中找到 i 个bug需要的天数期望,初始状态dp[0][0]=0,状态转移方程如下:
通过移向可以得到新的一条方程:
然而,这样做是会有问题的,问题在于最后一次递推,即 i = n 且 j = s 的时候,会出现除以0的情况,这样显然得不到正确结果,而且这也间接说明,这个状态方程其实是错的。因此我们需要对状态进行修改,即状态dp[i][j]表示在 j 个系统中找到 i 个bug后,距离目标状态的天数期望,初始状态dp
[s]=0,状态转移方程如下:
最终转移方程如下:
AC代码:
总结:
1、概率DP,套基本的期望公式即可;
2、逆向递推,
3、此题精度有毒
解题思路:
总的来说状态方程还是蛮好想的,每次找bug的时候,有可能会出现四种情况,一是在已经找到bug的系统中找到了旧bug,二是在新的系统中找到旧bug,三是在已经找到bug的系统中找到了新bug,二是在新的系统中找到新bug。于是,状态dp[i][j]表示在 j 个系统中找到 i 个bug需要的天数期望,初始状态dp[0][0]=0,状态转移方程如下:
dp[i][j] = dp[i][j]*(i*j/n/s) + dp[i][j-1]*(i*(s-j+1)/n/s) + dp[i-1][j]*((n-i+1)*j/n/s) + dp[i-1][j-1]*((n-i+1)*(s-j+1)/n/s) + 1
通过移向可以得到新的一条方程:
dp[i][j] = (dp[i][j-1]*(i*(s-j+1)/n/s) + dp[i-1][j]*((n-i+1)*j/n/s) + dp[i-1][j-1]*((n-i+1)*(s-j+1)/n/s) + 1) / (1-i*j/n/s)
然而,这样做是会有问题的,问题在于最后一次递推,即 i = n 且 j = s 的时候,会出现除以0的情况,这样显然得不到正确结果,而且这也间接说明,这个状态方程其实是错的。因此我们需要对状态进行修改,即状态dp[i][j]表示在 j 个系统中找到 i 个bug后,距离目标状态的天数期望,初始状态dp
[s]=0,状态转移方程如下:
dp[i][j] = dp[i][j]*(i*j/n/s) + dp[i][j+1]*(i*(s-j)/n/s) + dp[i+1][j]*((n-i)*j/n/s) + dp[i+1][j+1]*((n-i)*(s-j)/n/s) + 1
最终转移方程如下:
dp[i][j] = (dp[i][j+1]*(i*(s-j)/n/s) + dp[i+1][j]*((n-i)*j/n/s) + dp[i+1][j+1]*((n-i)*(s-j)/n/s) + 1) / (1-i*j/n/s)
AC代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,s; double dp[1005][1005]; int main() { while(~scanf("%d %d",&n,&s)) { double p1,p2,p3; for(int i=n;i>=0;i--) { for(int j=s;j>=0;j--) { if(i==n&&j==s) continue; p1=double((n-i)*j)/n/s; p2=double((i)*(s-j))/n/s; p3=double((n-i)*(s-j))/n/s; dp[i][j]=(p1*dp[i+1][j] + p2*dp[i][j+1] + p3*dp[i+1][j+1] + 1) / (1.0-double(i*j)/n/s); } } printf("%.4f\n",dp[0][0]); } return 0; }
总结:
1、概率DP,套基本的期望公式即可;
2、逆向递推,
3、此题精度有毒
相关文章推荐
- button的touch事件被打断
- Git使用教程之本地仓库的基本操作
- 如何在不允许联网的环境下使用Maven开发
- swift inheritace 继承
- 字符串压缩
- LeetCode--word search
- FPGA知识大梳理(一)对FPGA行业的一点感言
- poj1091 容斥原理的应用
- [uLua]关于ulua打包到安卓后无法加载Global的简易解决方法
- 时间格式转换
- 局域网链接ssh超级慢
- 签到第五天
- android studio之配置NDK开发环境
- 设计模式之适配器模式
- Vert.x 3学习笔记---13
- kafka命令
- 签到第四天
- 解决android2.1中Youku每次都要选择默认播放器的问题
- 页表项(PTE)地址计算公式的解释
- axis2学习——axis2的安装