期望dp
数学期望是指离散型随机变量的平均值。即考虑所有情况结果的平均值,它等于每种情况的概率与该情况下的结果的乘积之和。
比如一枚硬币,有正反两面,丢出正面或反面的概率相等,请问丢出正面的期望次数。
直觉告诉我们,需要丢两次。因为丢出正面的概率为 1 2 \frac{1}{2} 21,所以,需要丢出两次。
这是最简单的情形。
又比如掷一颗骰子,骰子有6个面,出现每个面的概率相等,请问丢出1的期望次数。
显然,直觉告诉我们,需要丢出6次。因为丢出1的概率是 1 6 \frac{1}{6} 61.
是不是期望次数就是概率的倒数呢?
独立随机试验下,首次出现某个事件的期望试验次数等于出现该事件的概率的倒数。
而期望并不仅仅指事件,也可以是针对其他变量的期望。期望,就是我们要求的值在所有情况下的平均值。比如,丢一枚硬币,正反面等概率出现,如果丢出正面,你得到1元,如果丢出反面,你得到0元。请问你丢一次期望多少元?
那么答案是0.5元。 1 2 ∗ 1 + 1 2 ∗ 0 = 0.5 \frac{1}{2}*1+\frac{1}{2}*0=0.5 21∗1+21∗0=0.5
在大多数情况下,期望都应该用其定义式或递推方程来计算。
我们来看如何用期望的定义来计算以上最简单的情形。
例1
丢一枚硬币,出现正面的期望次数。
分析:
统计所有情况下花掉的次数。第一次就丢出正面,花费1次;第二次才丢出正面,花费2次;第三次丢出正面,花费3次, … \dots …
g = 1 2 ∗ 1 + 1 4 ∗ 2 + ⋯ + i 2 i (1) g=\frac{1}{2}*1+\frac{1}{4}*2+\dots+\frac{i}{2^i} \tag{1} g=21∗1+41∗2+⋯+2ii(1)
2 ∗ g = 1 + 1 + 3 4 + ⋯ + i 2 i − 1 (2) 2*g=1+1+\frac{3}{4}+\dots+\frac{i}{2^{i-1}} \tag{2} 2∗g=1+1+43+⋯+2i−1i(2)
(2)-(1),可得:
1 2 g = 1 + 1 2 + 1 4 + ⋯ + 1 2 i − 1 = 1 \frac{1}{2}g=1+\frac{1}{2}+\frac{1}{4}+\dots+\frac{1}{2^{i-1}} = 1 21g=1+21+41+⋯+2i−11=1
g = 2 g = 2 g=2.
例2
丢一颗骰子,出现1的期望次数。
g = 1 ∗ 1 6 + 2 ∗ 5 6 ∗ 1 6 + ⋯ + 5 6 i − 1 ∗ 1 6 ∗ i g=1*\frac{1}{6}+2*\frac{5}{6}*\frac{1}{6}+\dots+{\frac{5}{6}}^{i-1}*\frac{1}{6}*i g=1∗61+2∗65∗61+⋯+65i−1∗61∗i
5 6 g = 1 ∗ 1 6 ∗ 5 6 + 2 ∗ 5 6 2 ∗ 1 6 + ⋯ + 5 6 i ∗ 1 6 \frac{5}{6}g=1*\frac{1}{6}*\frac{5}{6}+2*\frac{5}{6}^2*\frac{1}{6}+\dots+\frac{5}{6}^{i}*\frac{1}{6} 65g=1∗61∗65+2∗652∗61+⋯+65i∗61
g − 5 6 g = 1 6 ∗ ∑ i = 1 ∞ 5 6 i − 1 g-\frac{5}{6}g=\frac{1}{6}*\sum_{i=1}^\infin\frac{5}{6}^{i-1} g−65g=61∗∑i=1∞65i−1
g = 6 g=6 g=6
也可以用递推的方式来求,这是更加简便的方法。
例3
丢一枚硬币,出现正面的期望次数。
设 x x x为丢出正面的期望次数,丢一次以后,有 1 2 \frac{1}{2} 21的概率回到原状态,仍然是 x x x, 也有 1 2 \frac{1}{2} 21的概率成功,成功了就不需要再丢了。刚才花费了一次。所以有以下的递推式:
x = 1 2 x + 1 2 ∗ 0 + 1 x=\frac{1}{2}x+\frac{1}{2}*0+1 x=21x+21∗0+1
解得 x = 2 x=2 x=2
又如丢骰子,丢出每个面的概率都是 1 6 \frac{1}{6} 61
设丢出1的期望次数为 x x x, 丢1次以后,有 1 6 \frac{1}{6} 61的概率成功,不需要再丢了;有 5 6 \frac{5}{6} 65的概率未成功,即回到原状态,仍然期望丢 x x x次。而刚才花费了1次,所以,有以下的递推式:
x = 5 6 ∗ x + 1 6 ∗ 0 + 1 x = \frac{5}{6}*x+\frac{1}{6}*0+1 x=65∗x+61∗0+1
解得 x = 6 x=6 x=6.
例4
有n种牌,每种牌各1张,你取到每种牌都是等概率的,你取一张牌,记下该牌的种类,然后放回去。请问你记下所有的种类的牌期望要取多少次?
分析:
设 f [ i ] f[i] f[i]表示当前已经取到了i种牌,最后离成功(取到所有种类的牌)所期望的次数。
显然 f [ n ] = 0 f[n]=0 f[n]=0.
f [ i ] = i n ∗ f [ i ] + n − i n ∗ f [ i + 1 ] + 1 f[i] = \frac{i}{n}*f[i]+\frac{n-i}{n}*f[i+1]+1 f[i]=ni∗f[i]+nn−i∗f[i+1]+1
f [ i ] = f [ i + 1 ] + n n − i f[i]=f[i+1]+\frac{n}{n-i} f[i]=f[i+1]+n−in
这个题也适用于前面的简单的情形,即期望的次数是概率的倒数,因为一次取牌事件发生后,要么成功,要么回到原状态。取牌事件之间也是独立的。
即当前有i张牌,你有 n − i n \frac{n-i}{n} nn−i的概率取到1张新牌,有 i n \frac{i}{n} ni的概率取到一张之前的牌,仍然回到原状态。即从 i i i张牌到 i + 1 i+1 i+1张牌,只有 n − i n \frac{n-i}{n} nn−i的概率成功,这一步需要花费的期望次数为 n − i n \frac{n-i}{n} nn−i.
所以有:
f [ i ] = f [ i + 1 ] + n − i n f[i]=f[i+1]+\frac{n-i}{n} f[i]=f[i+1]+nn−i
一种错误的递推方式:
设 f [ i ] f[i] f[i]表示从取到 i i i张牌期望的取牌次数,考虑最近一次的取牌操作,有 i n \frac{i}{n} ni的概率取得的是旧牌,有 n − i + 1 n \frac{n-i+1}{n} nn−i+1的概率取得新牌。刚才的取牌花掉了一次操作,所以有下式:
f [ i ] = f [ i ] ∗ i n + f [ i − 1 ] ∗ n − i + 1 n + 1 f[i] = f[i]*\frac{i}{n} + f[i-1]*\frac{n - i + 1}{n} + 1 f[i]=f[i]∗ni+f[i−1]∗nn−i+1+1
f [ 1 ] = 1 f[1]=1 f[1]=1
此处的问题主要是 f [ i ] f[i] f[i]的意义与题意不符。按题意描述,如果取到了 n n n种牌,则不应再取了。而此处的 f [ n ] f[n] f[n]取到了 n n n种牌后,仍然可能取牌。
所以,此处求出的 f [ n ] f[n] f[n]并不能表示题目中期望次数。
例5.
题意:一个图有n个顶点,现在你站在顶点1处。开始时,图中没有边。
你可以重复以下操作:
-
从n个点中选择一个点(可以包含你当前所在的点),每个点都有 1 N \frac{1}{N} N1的概率被选中。每次选择都是独立的,和上一次选择无关。
-
在你当前站立的点和选择的点之间连一条边,然后移动到你选择的点上。
求图变为连通图时,期望的操作次数。
数据规模
2 ≤ N ≤ 1 0 5 2 \leq N \leq 10^5 2≤N≤105
这题与例4完全相同。
例6 . csp初赛题
现有一只青蛙,初始时在 n 号荷叶上。当它某一时刻在 k 号荷叶上时,下一时刻将等概 率地随机跳到 1, 2, …, k 号荷叶之一上,直至跳到 1 号荷叶为止。当 n = 2 时,平均一共 跳 2 次;当 n = 3 时,平均一共跳 2.5 次。则当 n = 5 时,平均一共跳_________次。
分析:设 f [ i ] f[i] f[i]表示青蛙在 i i i号荷叶上时,要跳到1号荷叶上的期望次数。
f [ i ] = f [ i ] ∗ 1 i + f [ i − 1 ] ∗ 1 i + ⋯ + f [ 1 ] ∗ 1 i + 1 f[i]=f[i]*\frac{1}{i}+f[i-1]*\frac{1}{i}+\dots+f[1]*\frac{1}{i} + 1 f[i]=f[i]∗i1+f[i−1]∗i1+⋯+f[1]∗i1+1
显然 f [ 1 ] = 0 f[1] = 0 f[1]=0
根据递推式,可以求出: f [ 2 ] = 2 , f [ 3 ] = 2.5 , f [ 4 ] = 17 6 , f [ 5 ] = 37 12 f[2] = 2, f[3] = 2.5, f[4] = \frac{17}{6},f[5] = \frac{37}{12} f[2]=2,f[3]=2.5,f[4]=617,f[5]=1237
例7. 涂格子
n个格子,每次随机涂一个,求涂m次后期望涂色格子数。
分析:
设 f [ i ] f[i] f[i]表示涂 i i i次后期望涂多少个格子。
f [ i ] = f [ i − 1 ] + n − f [ i − 1 ] n f[i]=f[i-1]+\frac{n-f[i-1]}{n} f[i]=f[i−1]+nn−f[i−1]
例8. 涂格子
n n n个格子,每次随机选一个格子涂色,第 i i i个格子被选到的概率为 p i p_i pi, ( ∑ p i = 1 ) (\sum_{p_i}=1) (∑pi=1),求涂完所有格子的期望次数。
数据规模: n ≤ 20 n \leq 20 n≤20
分析:
因为每个格子的概率不一样,所以不能以格子数量来作为状态,而以涂色格子的二进制state来表示状态。
设 f [ s t a t e ] f[state] f[state]涂到的格子为 s t a t e state state时,到最终状态期望的次数。
则有 f [ s t a t e ] = ∑ i = 0 n − 1 f [ s t a t e ∣ ( 1 < < i ) ] ∗ p i + 1 f[state] =\sum_{i=0}^{n-1} f[state |(1<<i)]*p_i+1 f[state]=∑i=0n−1f[state∣(1<<i)]∗pi+1
例9. 亚瑟王的生日庆典(poj3682)
题意:亚瑟王掷一枚硬币,正面朝上的概率为 p p p,反面朝上的概率为 1 − p 1-p 1−p。现在亚瑟王要举办生日庆典,举办的天数通过掷硬币确定。他每天掷有一次硬币,直到掷出k次正面朝上,就结束。第 i i i天的花费为 2 ∗ i − 1 2*i-1 2∗i−1。问:
期望要掷多少枚硬币才能达到 k k k次正面朝上,以及达到 k k k次正面朝上时的花费。
分析:
设 f [ i ] f[i] f[i]表示已经掷出 i i i次正面朝上,要完成k次还需要的期望次数。则有:
f [ i ] = f [ i + 1 ] ∗ p + f [ i ] ∗ ( 1 − p ) + 1 f[i]=f[i+1]*p+f[i]*(1-p)+1 f[i]=f[i+1]∗p+f[i]∗(1−p)+1
f [ i ] = f [ i + 1 ] + 1 / p f[i] = f[i+1]+1/p f[i]=f[i+1]+1/p
则有: f [ 0 ] = n / p f[0]=n/p f[0]=n/p
设 g [ i ] g[i] g[i]表示已经掷出 i i i次正面朝上,要完成 k k k次还需要的期望花费。注意:这个花费按照时间倒流的方式计算也是正确的。
g [ i ] = g [ i + 1 ] ∗ p + g [ i ] ∗ ( 1 − p ) + 2 ∗ f [ i ] − 1 g[i]=g[i+1]*p+g[i]*(1-p)+2*f[i]-1 g[i]=g[i+1]∗p+g[i]∗(1−p)+2∗f[i]−1
推出: g [ 0 ] = k ∗ ( k + 1 ) − k p p 2 g[0]=\frac{k*(k+1)-kp}{p^2} g[0]=p2k∗(k+1)−kp
#include<bits/stdc++.h>
int main()
{
int k;
double p,res1,res2;
while(scanf("%d%lf",&k,&p)&&k)
{
res1 = k/p;
res2 = k*(k+1)/(p*p)-res1;
printf("%.3lf %.3lf\n",res1,res2);
}
}