[学习笔记]概率与期望dp做题总结
2017-10-25 14:25
411 查看
之前做的一些就不记录了,只记录现在开始做的一些题。
T0. 入门题
给一个有向无环图,每次等概率走某一条边,求从1走到n的边权和的期望。
做法1,直接设dp[x]表示答案,转移显然。
做法2,考虑从定义入手分析出一种做法。期望的定义是E=sigma Pi*Wi,就是Wi出现的概率乘上他自己。
本题中即Answer(G) = simga { P(p_i)*W(p_i) },p_i表示一条路径,P(p_i)表示走p_i的概率,显然有:
P(p_i)=1/|p|,其中p是路径集合,|p|是其大小。现在P(p_i)有了,W(p)呢?
注意到若将路径p_i写成边的有序序列p_i = <e_1, e_2, e_3, ... , e_|p_i|>,并设w(e)表示e的边权,有:
W(p_i)=sigma { w(e_j) } , 1<=j<=|p_i|。代入Answer(G)可知Answer(G) = sigma { sigma { w(e_j) } / |p| } = sig
4000
ma { sigma { w(e_j) } } /|p|。
其中第一层sigma枚举的是路径,第二层枚举的是路径上的边。显然答案会是一个边权乘上他在式子中出现的次数,求和,再除以|p|.
记边i的系数是a_i,即Answer(G) = sigma { a_i * w(e_i) /|p| }。
考虑a_i的计算,这等价于有多少路径经过边e_i,显然这等价于有多少条路径经过这条边的起点u。这个是可以递推的。
T1. cf518D
大意,有一个队列。每一个时刻有p的概率弹出队首元素,(1-p)的概率啥事也不做。求T秒后弹出队列的元素期望。
两种做法,第一种,注意到仅仅设dp[t]表示答案是不行的,因为并不能递推。
考虑令dp[i][j]表示前i秒恰好j个元素弹出的概率(即第i秒弹出第j个元素),那么答案看起来就应该是
sigma dp[i][j]*j。(尽管不是,但是也差不多了,只差了一些细节)
这个转移看起来是显然的,即你枚举上一次弹出的时刻,然后中间乘起来即可,这个转移需要优化;
但其实有一个更简单的转移方法,即设f[i][j]表示前i秒弹出j个人但并不要求第j个是第i个弹出的;
那么显然有f[i][j]=p*f[i-1][j-1]+(1-p)*f[i-1][j],然后dp[i][j]=p*f[i-1][j-1]。
计算答案的时候分两种情况,第一种是在t秒内弹出全部的n个元素,答案是sigma dp[i]
*n
第二种是在i(i<t)秒内弹出j(j<n)个元素,此时要求弹出第j个元素之后不再弹出,因此概率还要乘上(1-p)^(t-i)。
两部分相加即可。
做法2,待补。
T0. 入门题
给一个有向无环图,每次等概率走某一条边,求从1走到n的边权和的期望。
做法1,直接设dp[x]表示答案,转移显然。
做法2,考虑从定义入手分析出一种做法。期望的定义是E=sigma Pi*Wi,就是Wi出现的概率乘上他自己。
本题中即Answer(G) = simga { P(p_i)*W(p_i) },p_i表示一条路径,P(p_i)表示走p_i的概率,显然有:
P(p_i)=1/|p|,其中p是路径集合,|p|是其大小。现在P(p_i)有了,W(p)呢?
注意到若将路径p_i写成边的有序序列p_i = <e_1, e_2, e_3, ... , e_|p_i|>,并设w(e)表示e的边权,有:
W(p_i)=sigma { w(e_j) } , 1<=j<=|p_i|。代入Answer(G)可知Answer(G) = sigma { sigma { w(e_j) } / |p| } = sig
4000
ma { sigma { w(e_j) } } /|p|。
其中第一层sigma枚举的是路径,第二层枚举的是路径上的边。显然答案会是一个边权乘上他在式子中出现的次数,求和,再除以|p|.
记边i的系数是a_i,即Answer(G) = sigma { a_i * w(e_i) /|p| }。
考虑a_i的计算,这等价于有多少路径经过边e_i,显然这等价于有多少条路径经过这条边的起点u。这个是可以递推的。
T1. cf518D
大意,有一个队列。每一个时刻有p的概率弹出队首元素,(1-p)的概率啥事也不做。求T秒后弹出队列的元素期望。
两种做法,第一种,注意到仅仅设dp[t]表示答案是不行的,因为并不能递推。
考虑令dp[i][j]表示前i秒恰好j个元素弹出的概率(即第i秒弹出第j个元素),那么答案看起来就应该是
sigma dp[i][j]*j。(尽管不是,但是也差不多了,只差了一些细节)
这个转移看起来是显然的,即你枚举上一次弹出的时刻,然后中间乘起来即可,这个转移需要优化;
但其实有一个更简单的转移方法,即设f[i][j]表示前i秒弹出j个人但并不要求第j个是第i个弹出的;
那么显然有f[i][j]=p*f[i-1][j-1]+(1-p)*f[i-1][j],然后dp[i][j]=p*f[i-1][j-1]。
计算答案的时候分两种情况,第一种是在t秒内弹出全部的n个元素,答案是sigma dp[i]
*n
第二种是在i(i<t)秒内弹出j(j<n)个元素,此时要求弹出第j个元素之后不再弹出,因此概率还要乘上(1-p)^(t-i)。
两部分相加即可。
做法2,待补。
相关文章推荐
- 期望(二)—— 概率与期望 DP 学习笔记
- 期望&概率dp总结
- ACM概率期望dp刷题总结
- 【专题总结】概率&期望DP
- 动态规划练习题:概率DP总结,求解数学期望或概率的题目
- <学习笔记?>考试与做题的注意事项总结。
- Android笔记之greenDao3.0学习总结
- Algorithm学习笔记 --- 最长公共子序列(DP-动态规划实现)
- 【BZOJ-1419】Red is good 概率期望DP
- css学习笔记——css样式总结
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [4] 首页 APP 接口开发方案 ③ 定时读取缓存方式
- JMS学习笔记总结1
- 概率论之概率dp与期望的极限求解
- 概率图模型(PGM)学习笔记(三)模式推断与概率图流
- JAVA学习笔记Day24——javaTCP UDP网络编程Socket总结
- hdu 3853 LOOPS(概率DP求期望)
- OC学习笔记总结(Block语法开始)
- 【Codeforces Round 275 (Div 2)E】【状压DP 概率DP求期望 线性相加思想 二进制系统函数】Game with Strings n个串目标串随机猜位置随机的猜出答案的期望步
- [Python] Python学习笔记之常用模块总结[持续更新...]
- Poj 2096 Collecting Bugs (概率DP求期望)