一些定义及性质:
1.$P(A)$表示事件A发生的概率,$E(A)$表示事件A的期望。
2.独立事件:若事件A与B满足$P(AB)=P(A) imes P(B)$,则称A与B互相独立。同时它们也满足$E(AB)=E(A) imes E(B)$。
3.期望的线性性:对于任意事件A与B,均有$E(A+B)=E(A)+E(B)$。
证明:
$E(X+Y)=sum sum {P(x=i且y=j) imes(i+j)}$
$=sum sum {P(x=i且y=j) imes i}+sum sum {P(x=i且y=j) imes j}$
$=sum {i imes sum P(x=i且y=j)}+sum {j imes sum P(y=j且x=i)}$
$=sum {i imes P(x=i)}+sum {j imes P(y=j)}$
$=E(X)+E(Y)$
4.期望的本质就是算概率。
5.概率的可加性:对于若干个两两互不相容的事件,$P(这些事件均发生)=sum P(其中某个事件发生)$
常用技巧——前缀和技巧:对于离散变量x,$P(x=k)=P(xleq k)-P(xleq k-1)$。
例1:n个元素每个从1-s随机取值,求这些元素中最大值的期望。
解:
令S为最终答案,X为元素中的最大值。
由期望的线性性可得$E(S)=sum E(X)=sum {P(X=i) imes i}$
由于$P(X=i)=P(Xleq i)-P(Xleq {i-1})=(frac{i}{s})^{n}-(frac{i-1}{s})^{n}$
所以$E(S)=sum {P(X=i) imes i}=sum {i imes[(frac{i}{s})^{n}-(frac{i-1}{s})^{n}]}$
例2:每次操作发生概率为p的事件期望$frac{1}{p}$次操作后发生。
证:
令S为最终答案,X为该事件在第X次发生。
由期望的线性性可得$E(S)=sum E(X)=sum {P(X=i) imes i}$
由于$P(X=i)=P(Xgeq i)-P(Xgeq {i-1})=(1-p)^{i-1}-(1-p)^{i}$
所以$E(S)=sum {P(X=i) imes i}=sum {[(1-p)^{i-1}-(1-p)^{i}] imes i}=sum_{i=0}^{infty}{(1-p)^{i}}=frac{1}{p}$
结论:$E(X)=sum {P(Xgeq i)}$
证明1:同上。
证明2:
$E(X)=sum_{i=1}^{infty}{P(X=i) imes i}=sum_{i=1}^{infty}{P(X=i) imes sum_{j=1}^{i}1}=sum_{j=1}^{infty}{1 imes {sum_{i=j}^{infty}P(X=i)}}=sum {P(Xgeq i)}$
拿球问题:
1.有n个球1-n,求从里面拿m次球不放回的期望点数之和。
解:
令S表示最终答案,Xi表示i对答案的贡献。
由期望的线性性可得$E(S)=sum E(Xi)=sum {P(Xi=i) imes i}$
由于$P(Xi=i)=frac{C_{n-1}^{m-1}}{C_n^m}=frac{m}{n}$
所以$E(S)=sum {P(Xi=i) imes i}=sum {frac{m}{n} imes i}=frac{m}{n} imes sum i=frac{m imes(n+1)}{2}$
2.有n个球1-n,求从里面拿m次球放回的期望点数之和。
解:显然$ans=frac{1+n}{2} imes m=frac{m imes(n+1)}{2}$
3.有n个球1-n,每次从里面拿一个球,有pi的概率放回i个与这个球相同点数的球。求拿m次的期望点数之和。
解:
令S表示最终答案,Xi表示i对答案的贡献,Yi表示i被拿了几次。显然有$E(Xi)=E(Yi) imes i$。
由期望的线性性可得$E(S)=sum E(Xi)=sum {E(Yi) imes i}$
由于一共拿了m次,易得$sum Yi=m$
所以$sum E(Yi)=E(m)=m$
由于每个球的概率均等,所以每个球在这个问题里是等价的,所以$E(Y1)=E(Y2)=cdots=E(Yn)=frac{m}{n}$
所以$E(S)=sum {E(Yi) imes i}=sum {frac{m}{n} imes i}=frac{m imes(n+1)}{2}$
结论:拿球问题中只要保证每个球等价,那么放不放回去,放回去几个对期望答案没有影响。
游走问题:(每次等概率选一条边走出去)
1.求在一条链上从一端随机游走到另一端的期望步数。
解:
令S表示最终答案,Xi表示从i第一次走到i+1的步数。
由期望的线性性可得$E(S)=sum E(X_{i})$
由于$E(X_{i})=0.5 imes1+0.5 imes[1+E(X_{i-1})+E(X_{i})]$和$E(X1)=1$,可以解出$E(X_{i})=E(X_{i-1})+2$
所以$E(S)=sum E(X_{i})=(n-1)^2$
2.求在完全图上从一个点走到另一个点的期望步数。
解:相当于每次操作有$frac{1}{n-1}$的概率成功,于是需要$n-1$步。
3.求在2n个点的完全二分图上从一个点走到另一个点的期望步数。
解:
令A表示两个点在同侧的期望步数,B表示两个点在异侧的期望步数。
则有$B=frac{1}{n}+frac{n-1}{n} imes (1+A),A=1+B$
解得$A=2n,B=2n-1$
4.求在菊花图上从一个点走到另一个点的期望步数。
解:
令A表示从一个叶子走到另一个叶子的期望步数,B表示从根走到一个叶子的期望步数。
则有$A=1+B,B=frac{1}{n-1}+frac{n-2}{n-1} imes (1+A)$
解得$B=2n-3,A=2n-2$
5.求在一棵树上从一个点随机游走到另一个点的期望步数。
解:
首先将两个点中的其中一个点作为根,然后树形dp。
设$g(u)$表示从u第一次走到u的父亲的期望步数,$d(u)$表示u点的度数,$v$表示u的儿子。
则有$g(u)=frac{1}{d(u)}+sum {frac{1}{d(u)} imes (1+g(v)+g(u))}$
解出答案后dp出整棵树的答案,然后根据期望的线性性,将从目标点到根的路径上所有$g(x)$求和即可。
6.构造一个200个点的图,使得存在两个点之间随机游走的期望步数$geq 10^6$
解:
考虑到一条链上的$E(1)=1$而$E(S)=(n-1)^2$,发现$10^6$大约是$n^3$级别,所以只需要将$E(1)$构造到n级别即可。
那么显然可以构造一个完全图加一条链。期望步数$n^3$步。
经典问题:
1.每次随机一个1-N的整数,求期望几次凑齐所有数。
解:
令S为最终答案,Xi为从凑齐i-1个数到凑齐i个数的步数。
由期望的线性性可得$E(S)=sum E(Xi)$
考虑$E(Xi)$,发现每次操作能够多凑出一个数的概率为$frac{n-i+1}{n}$
根据“概率为p的事件发生的期望次数为$frac{1}{p}”$,得到$E(Xi)=frac{n}{n-i+1}$
所以$E(S)=sum frac{n}{n-i+1}$
2.随机一个长度为n的排列p,求p[1]~p[i]中p[i]是最大的数的概率。
解:在大小关系上1-p的每个前缀和一个1-i的排列是等价的。由于1-i的排列i出现在每一位上的概率均等,所以所求概率为$frac {1}{i}$
3.求上一题中i的个数的平方的期望。(平方的期望≠期望的平方)
解:
令S为最终答案,Xi为i是不是前i个数中最大的那个数。
可得$E(S^2)=E((sum{Xi})^2)=E(sum_{i≠j}{XiXj}+sum {Xi^2})$
由期望的线性性可得$E(S^2)=sum_{i≠j}{E(XiXj)}+sum{E(Xi^2)}$
考虑一组i与j,容易发现$P(XiXj)$为i是且j是max的概率,由于i与j独立可以得到$P(XiXj)=frac{1}{i imes j}$
那么$sum_{i≠j}{E(XiXj)}=sum_{i≠j}{P(XiXj)}=sum_{i≠j}{frac{1}{i imes j}}$
所以$E(S^2)=sum_{i≠j}{frac{1}{i imes j}}+sum{frac{1}{i}}$
4.求排列p中i在j后面的概率(i≠j)。
解:由于i在j后面的概率和j在i后面的概率是一样的,并且和为1,所以概率为$frac{1}{2}$
5.求排列p中包含W[1]~W[m]的概率。
解:
做法一:包含的情况总数为$C_n^{m} imes(n-m)!=frac{n!}{m!(n-m)!} imes (n-m)!=frac{n!}{m!}$,情况总数为$n!$
于是概率为$frac{frac{n!}{m!}}{n!}=frac{1}{m!}$
做法二:发现包含W的概率与包含W的任一排列的概率均相等。而只要W合法则p中一定包含W的某个排列。故概率和为1,每种的概率为$frac{1}{m!}$
6.求排列p中包含W[1]~W[m]且连续的概率。
解:简单组合计数。答案为$frac{(n-m+1) imes (n-m)!}{n!}$
7.有n堆石头,每堆有ai个,每次随机选一个石头然后把那一整堆扔了,求第1堆期望第几次被扔。
解:
令Xi为i期望第几次被扔。
根据排名的定义,我们有$Xi=sum{Xjleq Xi}$,其中$Xjleq Xi$是一个01状态。
由期望的线性性可得$E(X1)=sum{E(Xi<Xj)}+1=sum{P(Xi<X1)}+1$
考虑一组i与j,显然有$P(Xi<Xj)=frac{ai}{ai+aj}$
所以$E(X1)=sum{frac{ai}{ai+a1}}+1$
8.有n个数,每次操作删除一个,并把两边的序列拼回去,求i和j在过程中相邻的概率。
解:
问题可以转化为有一个排列p,求i和j之间的数都小于等于i和j的概率。
那么只考虑i到j这一段,得到概率为$frac{2 imes (j-i-1)!}{(j-i+1)!}=frac{2}{(j-i+1)(j-i)}$
9.随机一个01串,假设每一位有p的概率为1,定义x是所有连续的1的长度的平方之和,求x的期望。
解:
逐位dp,我们设$Y_i$表示1-i最后一段连续1的长度,$X_i$表示1-i所求答案。
考虑位置i,若该位为0:$Y_{i}=0,X_{i}=X_{i-1}$
若该位为1:$Y_{i}=Y_{i-1}+1,X_{i}=X_{i-1}-(Y{i-1}^2)+((Y_{i-1}+1)^2)=X_{i-1}+2Y_{i-1}+1$
由期望的线性性可得
$E(X_{i})=p imes E(X_{i-1}+2Y_{i-1}+1)+(1-p) imes E(X_{i-1})=p imes (E(X_{i-1})+2E(Y_{i-1})+1)+(1-p) imes E(X_{i-1})$
$E(Y_{i})=p imes (1+E(Y_{i-1}))+(1-p) imes 0=p imes (1+E(Y_{i-1}))$
按位求解即可。
10.给定一棵树,将所有边随机后依次插入,求u,v期望什么时候联通。
解:
考虑枚举u到v的边最后一次出现的位置i,分别统计。
记$dis(u,v)=k$,由期望的线性性得$E(S)=sum E(Xi)=sum_{i=k}^{n-1}{frac{C_{i-1}^{k-1} imes k! imes (n-1-k)!}{(n-1)!}} imes i$
11.给定1-n这些数,每次随机选一个数并删掉所有这个数的约数,求期望几次删完。
解:
将问题转化为:每次选一个数,如果它没被标黑就标黑它的所有约数并删掉它,否则直接删掉它,求期望删到几个没被标黑的数。
(目标:从一次操作删除多个转化为一次操作删除一个,以使用期望的线性性)
令S为最终答案,Xi为i是否有贡献。
由期望的线性性得$E(S)=sum E(Xi)=sum P(Xi)$
发现i有贡献相当于i的所有倍数都在它后面被删。
根据“一个排列m个元素的集合中第m个元素排在第一位的概率是$frac{1}{m}$”可以得到$P(Xi)=frac{1}{lfloor{frac{n}{i}} floor}$
那么得到$E(S)=sum {frac{1}{lfloor{frac{n}{i}} floor}}$
一些练习题:
1.一个序列每次删一个数,贡献是左右两数之积,求期望贡献和。
解:
令S为最终答案,Xi,j表示i位置与j位置是否有贡献。
由期望的线性性得$E(S)=sum E(Xi,j) imes Wi imes Wj=sum P(Xi,j) imes Wi imes Wj$
考虑i与j有贡献则需要i和j中间的所有元素都在i和j之前被删。
根据简单组合计数得到$P(Xi,j)=frac{2}{(j-i+1)(j-i)}$
那么$E(S)=sum {frac{2}{(j-i+1)(j-i)} imes Wi imes Wj}$
2.三个数中间那个最大的概率是$frac{1}{3}$(
3.有n个数,每次随机选两个数合成一个数,收益是两数之和,求期望收益。
解:
令S为最终答案,Xi为i被选的次数。由期望的线性性得$E(S)=sum E(Xi) imes Ai$
考虑第k次操作相当于从n-k+1个团中随机选择两个团。
那么显然在这次操作中i所在的团被选中的概率是$frac{2}{n-k+1}$
所以$E(Xi)=sum_{j=1}^{n-1}{frac{2}{n-j+1}}$
得到$E(S)=sum {Ai imes sum_{j=1}^{n-1}{frac{2}{n-j+1}}}$
4.给出一棵树,每次选一个白点将其子树里所有点染黑,求期望几次染黑整个树。
解:
将问题转化为:每次选一个点,如果它没被标记就标记它的子树并将它删除,否则直接删除,求期望选到几个没被标记的点。(同“经典问题11”)
令S为最终答案,Xi为i是否有贡献。
由期望的线性性得$E(S)=sum E(Xi)=sum P(Xi)$
发现若i有贡献则需要i的祖先都在它后面。
得到$P(Xi)=frac{1}{dep(i)}$,所以$E(S)=sum frac{1}{dep(i)}$
解:
令S为最终答案,Xi表示从第i-1天到第i天的距离。
由期望的线性性得$E(S)=sum E(Xi)$
容易发现第i-1天到第i天的距离期望与:i是否申请,i-1是否申请有关。
于是考虑设$dp(i,j,0/1)$表示前i门课,已经用了j次申请机会,第i门课是否申请的最短期望距离之和。
那么由期望的线性性得
$dp(i,j,0)=min(dp(i-1,j,0)+E(i不申请i-1不申请),dp(i-1,j,1)+E(i-1申请i不申请))$
$dp(i,j,1)=min(dp(i-1,j-1,0)+E(i申请i-1不申请),dp(i-1,j-1,1)+E(i申请i-1申请))$
是否申请的期望分类讨论一下即可。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #define maxn 2005 #define maxm 505 #define inf 0x7fffffff #define ll long long #define rint register int using namespace std; int N,M,V,E,c[maxn],d[maxn]; double k[maxn],dp[maxn][maxn][2],dis[maxm][maxm]; inline int read(){ rint x=0,f=1; char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f; } inline void Floyd(){ for(rint k=1;k<=V;k++) for(rint i=1;i<=V;i++) for(rint j=1;j<=V;j++) if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j]; return; } int main(){ //freopen("testdata.in","r",stdin); //freopen("1.out","w",stdout); N=read(),M=read(),V=read(),E=read(); for(rint i=1;i<=N;i++) c[i]=read(); for(rint i=1;i<=N;i++) d[i]=read(); for(rint i=1;i<=N;i++) scanf("%lf",&k[i]); for(rint i=1;i<=V;i++) for(rint j=1;j<=V;j++) dis[i][j]=1e9; for(rint i=1;i<=V;i++) dis[i][i]=0; for(rint i=1;i<=E;i++){ rint u=read(),v=read(),w=read(); dis[u][v]=min(dis[u][v],(double)w); dis[v][u]=min(dis[v][u],(double)w); } Floyd(); for(rint i=0;i<=N;i++) for(rint j=0;j<=M+3;j++) dp[i][j][0]=dp[i][j][1]=1e9; dp[1][0][0]=dp[1][1][1]=0; for(rint i=2;i<=N;i++) for(rint j=0;j<=M;j++){ dp[i][j][0]=min(dp[i-1][j][0]+dis[c[i-1]][c[i]],dp[i-1][j][1]+k[i-1]*(dis[d[i-1]][c[i]])+(1.0-k[i-1])*dis[c[i-1]][c[i]]); if(j) dp[i][j][1]=min(dp[i-1][j-1][0]+k[i]*dis[c[i-1]][d[i]]+(1.0-k[i])*dis[c[i-1]][c[i]],dp[i-1][j-1][1]+k[i]*k[i-1]*dis[d[i-1]][d[i]]+k[i]*(1.0-k[i-1])*dis[c[i-1]][d[i]]+(1.0-k[i])*k[i-1]*dis[d[i-1]][c[i]]+(1.0-k[i])*(1.0-k[i-1])*dis[c[i-1]][c[i]]); } double ans=1e9; for(rint j=0;j<=M;j++) ans=min(ans,min(dp[N][j][0],dp[N][j][1])); printf("%.2lf ",ans); return 0; }
区间交:定义一种随机生成区间的方法:L=Random(1,N),R=Random(L,N)。现在这样随机出两个区间,求他们相交的概率。
解:
发现相交的概率不是那么的好求,不如求不相交的概率后进行容斥。
设两个区间分别为$[l1,r1]$与$[l2,r2]$,在这里我们强行规定$l1leq l2$
直接计数不太方便,考虑枚举l2,求出有多少r1会出现在l2之前。
设f(r)表示生成一个右端点$leq$ r的区间的概率。
则不相交的概率就为$sum_{i=2}^{N}{frac{f(i-1)}{N}} imes 2$
再设g(r)表示生成一个右端点=r的区间的概率,容易发现$g(r)=frac{sum_{l=1}^{r}{frac{1}{N-l+1}}}{N}$
那么$f(r)=sum_{i=1}^{r}{g(i)}$,所以$ans=1-(sum_{i=2}^{N}{frac{sum_{r=1}^{i-1}{g(r)}}{N}}) imes 2$
Deep Dark Forest:给定一棵树,每条边的长度有$frac{1}{2}$概率是0,$frac{1}{2}$概率是1,求直径长度的期望。
解:
首先考虑一个结论:对于任意的一棵树,从Root开始找距离它的最远点L,再从L开始找距离它的最远点R,则$[L,R]$一定是树的一条直径。
证明的话画个图就差不多清楚了。那么我们令X为这棵树直径的长度。
由期望线性性得$E(X)=sum P(X=i) imes i$
由“常用技巧”中的结论得到$E(X)=sum_{i=1}^{n}{P(X>=i)}=sum_{i=1}^{n}{1-P(X<i)}$
由于直径的lca可能是任一节点,所以考虑树形dp。
设$dp(i,j)$表示在以i为根的子树中,这个子树的深度的长度为j,满足直径<K(K是当前枚举的值)的概率。
若转移顺序不好会增加复杂度,那么考虑设计一个转移顺序。
我们不妨依次考虑u的所有儿子v,那么再枚举处理到v之前的深度j(满足j+k<K)
就可以得到$dp(u,max(j,k))=dp(u,j)+0.5 imes dp(v,k)+0.5 imes dp(v,k-1)$
初始状态为每个叶节点的$dp(u,0)=1$,复杂度$O(n^3)$
球染色:给定初始每个球的颜色c[1]~c[n],每次操作选取i与j并令c[i]=c[j],求期望多少步把所有球染成同一种颜色。
解:
考虑一个经典技巧:枚举最后的颜色使得原序列变为一个01串。
令S为最终答案,Xi为把所有球染成颜色ci的步数,由期望的线性性得$E(S)=sum E(Xi)$
一个01串中的操作共有4种:选择00,11,01,10。我们的目标是将原串变为全1。
那么设Yi表示从i-1个1变到i个1的步数。则$E(Xi)=sum E(Yi)$
考虑前两种操作对1的个数没有影响,第三种操作会增加一个1,第四种操作会减少一个1。
那么$E(Y_i)=0.5 imes(1+E(Y_i))+0.25 imes 1+0.25 imes(1+E(Y_{i-1}+E(Y_i)))$,递推即可。
当然还可以设Yi表示从i个1变到n个1的步数。
那么$E(Y_i)=0.5 imes(1+E(Y_i))+0.25 imes (1+E(Y_{i-1}))+0.25 imes(1+E(Y_{i+1}))$,高斯消元即可。
区间反转:01串每次随机一个区间将每个数取反,求m次后1的期望个数。
解:
令S为最终答案,Xi为i最后的值,由期望的线性性得$E(S)=sum E(Xi)=sum P(Xi=1)$
枚举每一位,设$dp(j,0/1)$表示这一位在j次后为0/1的概率。
令pi表示i这一位每次被选中的概率,容易得到$pi=frac{i imes (n-i+1)}{n imes n}$
则$dp(j,0)=dp(j-1,0) imes (1-pi)+dp(j-1,1) imes pi,dp(j,1)=dp(j-1,0) imes pi+dp(j-1,1) imes (1-pi)$
发现每次的转移系数相同,使用矩阵快速幂优化dp即可。
凸包:给n个点,随机选一个点集,求二维凸包的期望点数,保证没有三点共线。
解:
令最终答案为S,Xi,j为i与j的连线是否在凸包上,那么有$S=sum_{i=1}^{n-1}{sum_{j=i+1}^{n}{Xi,j}}$
由期望的线性性得$E(S)=sum_{i=1}^{n-1}{sum_{j=i+1}^{n}{E(Xi,j)}}$
考虑若$Xi,j=1$,则整个点集一定位于平面上直线$(i,j)$的左侧或右侧(上侧或下侧)。
那么设直线$(i,j)$的左边有s0个点,右边有s1个点。
则$E(i,j)=P(i,j)=frac{2^{s0}+2^{s1}}{2^{s0+s1}}=frac{1}{2^{s1}}+frac{1}{2^s0}$
单选错位:有n个选择题,每道有ai个选项,正确选项随机。你做对了这n道题但你把答题卡抄错了一位,求你期望对的题数。
解:
(相当于求期望有多少个选项与它左边的答案相同)
令S为最终答案,Xi为每个选项对不对,由期望的线性性得$E(S)=sum E(Xi)=sum P(Xi=1)$
容易得到$P(X{i}=1)=frac{min(a_{i-1},a_{i})}{a_{i-1} imes a_{i}}$
PKUWC2019拓扑排序:一个n个点的有向图,每条边等概率存在或不存在,求拓扑序列数量的期望$ imes 2^{m}$。$nleq 20$
解:
(在PPt里看到了……然而好像跟期望没什么关系)
签到题。由于期望$ imes 2^{m}$相当于没期望的事,只需要对每种连边方案统计答案。
由于n很小所以考虑用点集的状态统计边集的状态,设$dp(s)$表示点集s的方案数之和。
考虑枚举x作为拓扑排序中第一个点,那么s中其他点一定不能向x连边,而x向s中其他点连边不受约束。
于是得到$dp(s|x)=dp(s) imes 2^{card(s)}$
KILL:一开始有n个人,每次操作选一个还没死的人让他离开,他离开前会向其他所有人开一枪,有p的概率致死,求一个人活着离开且一共被开了k枪的概率。
解:
做法一:设$dp(i,j)$表示第i个人走了,还剩j个人的概率。
考虑枚举这一轮死了l个人,显然有$dp(i+1,j-l-1)+=dp(i,j) imes p^{l} imes (1-p)^{j-l-1}$
最后统计一波答案就好了。
做法二:将问题转化为死人放着,随机到再让他走,那么共进行n轮。
考虑设$dp(i,j)$表示剩下i个人,前面有j个人开了枪的概率。
那么分这次随机到的人是死人还是活人转移即可。
即为$dp(i-1,j)=dp(i,j) imes (1-(1-p)^{j})$,$dp(i-1,j+1)=dp(i,j) imes (1-p)^{j}$