【wqy】期望,概率

DAY6概率(照着打一遍整理思路

概率

概念

  • 概率:一件事情发生的可能性

  • 期望:平均值,\(E=\sum P_iw_i\)

  • 两者的联系:概率为\(p\)的事件期望\(\frac1p\)次后发生。

  • 独立事件:对于两个独立事件\(A,B\)\(P(AB)=P(A)P(B)\) (期望的不相关可积性)

  • 对于离散变量\(X\),\((P_{(X=K)}=P_{(X\le K)}-P_{(X\leq K-1)})\)

  • 期望的线性性:\(E(x+y)=E(x)+E(y)\),无论\(x\)\(y\)是否独立

线性性==
  (E(x+y)=E(x)+E(y)) 任意(x,y)
[E(x+y)=sum_i sum_j P(x=i,y=j)(i+j)]
[sum_i sum_j P(x=i,y=j) i]
[=sum_i i P(x=i)]
j同理
得到
[sum_iiP(x=i)+sum_jjP(x=j)]
[=sum_i sum_j P(x=i,y=j) i+sum_i sum_j P(x=i,y=j) j]
[sum_i sum_j P(x=i,y=j)(i+j)]
[=E(x+y)] 
  • 方差:随机变量的方差定义为\(V(x)=E\big((x-E(x))^2\big)\)

    \[V(x)=E\big((x-E(x))^2\big)=E(x^2-2xE(x)+E(x)^2) \]

      	$$=E(x^2)-E(2xE(x))+E(E(x)^2)$$  将$E(2xE(x))$可转化为$2E(x)^2$ 
    

    \(=E(x^2)-E(x)^2\)

    即方差的期望等于平方的期望减去期望的平方

练习

  • 每次随机一个\([1, n]\) 中的数,求期望几次能随机出所有的数。

    根据期望的线性性,只需要考虑要想把第\(i\)个数随机出来,期望需要随机几次。
    对于第\(i+1\)个数,它被随机到的概率是\(\frac{n-i}n\),期望就是\(\frac n{n-i}\)
    \(E=\frac nn+\frac n{n-1}+...+\frac n1=O(n\ ln\ n)\)

  • 随机一个排列 求\(p_i\)\(p_1,p_2,..,p_i\)中最大的数的概率
    所有的数是等价的,所以\(p_1\)\(p_i\)中每一个数成为最大值的概率是相等的 概率就是\(\frac1i\)

随机游走

DAG

一张从\(S\)\(T\)的DAG,求从\(S\)随机游走到\(T\)的期望步数

\(f_i\)为从\(i\)走到\(T\)的期望步数 拓扑排序后DP 枚举每一个点的出边转移 \(f_u=\frac1{d_u}\sum(f_v+1)\)

有一条长度为\(n\)的链,求从一端走到另一端的期望步数 每次随机向左或者向右走,如果当前在一端那么就只能向另一端走

\(f_i\)表示从\(i\)走到\(i+1\)的期望步数 答案为\(f_0+f_1+f_2+...+f_{n-1}\)

首先\(f_0=1\)

考虑第\(i\)个节点 若它第一步向右,则步数为\(1\),概率为\(\frac12\)

若向左,则步数为\(f_{i-1}+f_i+1\),概率为\(\frac12\)

所以\(f_i=\frac12*1+\frac12*(f_{i-1}+f_i+1)\) 化解得\(f_i=f{i-1}+2\)

\(ans=1+3+5+...+(2n-1)=n^2\)

团—完全图

\(n\)个点的完全图 求从\(S\)随机游走到\(T\)的期望步数

每个点都是等价的

\(E\)表示从一个点走向另一个点的期望步数,则$$E=\frac1{n-1}1+\frac {n-2}{n-1}(E+1)=n-1$$

\(\frac1{n-1}\)的概率成功 类比抛硬币 每次\(\frac 1{n-1}\)抛到正面 期望步数为\(n-1\)

n点菊花图游走,根到x的期望步数

\[E=\frac{1}{(n-1)}+\frac{(n-2)}{(n-1)}*(2+E)=(2n-1) \]

构造

构造一个\(200\)个节点的无向图,使得从\(1\)随机游走到\(n\)的期望步数超过\(10^6\)

100个点的完全图伸出来一条长度为100的链

\(E_0\)表示从完全图里的一个点走向链头的期望步数,\(E_0=99\)

\(f_i\)表示在链上从\(i\)走向\(i+1\)的期望步数 \(f_0=\frac1{100}+\frac{99}{100}(99+1+f_0)\) \(f_0=9901\)

\(f_i=f_{i-1}+2\) \(ans=9901+9903+...+10099=10^6\)

一棵树 求\(S\)随机游走到\(T\)的期望步数

根据期望的线性性,只需要求出从一个点随机游走到达它的父节点的期望步数\(f_x\)和从父节点随机游走到它的期望步数\(g_ x\)\(x\)的度数是\(d_x\)

对于\(f\) 枚举点\(x\)下一步是向上走还是向下走 \(f_x=\frac1{d_x}+\sum_v\frac1{d_x}*(f_v+f_x+1)=d_x+\sum_vf_v\)

对于\(g\) \(g_x=\frac1d+\frac1d(1+g_{fa_x}+g_x)+\sum_{fa_y=fa_x}\frac1d(1+f_y+g_x))\)
\(=d_{fa_x}+g_{fa_x}+\sum_{fa_y=fa_x}f_y=d_{fa_x}+g_{fa_x}+f_{fa_x}-d_{fa_x}-f_x\)
\(=g_{fa_x}+f_{fa_x}-f_x\)

实战

noip2016换教室

bzoj4318 OSU!

有一个长度为\(n\)的序列,第\(i\)个位置有\(p_i\)的概率为\(1\)\(1 − p_i\)的概率为\(0\),一个序列的分数是所有极长连续的\(1\)的长度的三次方和。求期望分数。

一次方:\(ans=\sum p_i\)
二次方:\(f_i\)表示以\(i\)为结尾的长度的期望 \(g_i\)表示以\(i\)结尾的长度的平方的期望
\(f_{i+1}=p_{i+1}(1+f_i)\)\(g_{i+1}=E((x+1)^2)=E(x^2+2x+1)=p_{i+1}(g_i+2f_i+1)\)
同理 \(h_i\)表示以\(i\)结尾的三次方的期望 \(h_{i+1}=E((x+1)^3)=E(x^3+3x^2+3x+1)=p_{i+1}(h_i+3g_i+3f_i+1)\)

\(ans=\sum h_i(1-p_{i+1})\)

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	rd(n);
	for(int i=1;i<=n;++i) scanf("%lf",&p[i]);
	for(int i=1;i<=n;++i)
	f[i]=p[i]*(f[i-1]+1),g[i]=p[i]*(g[i-1]+2*f[i-1]+1),h[i]=p[i]*(h[i-1]+3*g[i-1]+3*f[i-1]+1);
	for(int i=1;i<=n;++i) ans+=(1-p[i+1])*h[i];
	printf("%.1f",ans);
    return 0; 
}

其实还可以化解一下h[i]=h[i-1]+p[i]*(3*g[i-1]+3*f[i-1]+1)

SCOI2008 奖励关

看到\(k\le15\)很容易想到状压

\(f[i][st]\)表示当前第\(i\)个物品状态为\(st\)的期望分数

然鹅这亚子我们无法判断这个状态是否合法

所以我们倒着来推 最后输出\(f[1][0]\)就好拉


int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	for(int i=1;i<=16;++i) base[i]=1<<i;
	rd(n),rd(k);
	for(int i=1,x;i<=k;++i){
		rd(a[i]);
		while(rd(x),x) pre[i]|=base[x];
	}
	for(int i=n;i;--i)
		for(int st=0;st<=base[k+1]-1;++st){
			for(int j=1;j<=k;++j)
				if((pre[j]&st)==pre[j]) f[i][st]+=Max(f[i+1][st],f[i+1][st|base[j]]+(double)a[j]);
				else f[i][st]+=f[i+1][st];
			f[i][st]/=(double)k;
		}
	printf("%.6lf",f[1][0]);
    return 0; 
}

SPOJ1026 FAVDICE

一个n面的骰子,求期望掷几次能使得每一面都被掷到

优惠券收集者问题

f[i]表示已掷到i面,期望掷多少面才能使每一面都掷到

\(\frac in\)的概率掷到已掷到的,\(\frac{n-i}f\)的概率掷到未掷到过的

所以\(f[i]=\frac in \times f[i] +\frac {n-i}n \times f[i+1]+1\)

\(掷到已掷到的概率\times已掷到i面还期望掷的次数+掷到未掷到的概率\times掷到i+1面还期望掷的次数\)至少得掷一次所以后面+1

化简得\(f[i]=f[i+1]+\frac n{n-i}\)

#include <iostream>
using namespace std;
const int N=10000+5,M=20000+5,inf=0x3f3f3f3f,P=19650827;
int n;double f[N];
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int main(){
//	freopen("in2.txt","r",stdin);
	//freopen("xor.out","w",stdout);
	int T;rd(T);
	while(T--){
		rd(n);f[n]=0;
		for(int i=n-1;i>=0;--i) f[i]=f[i+1]+(double)n/(n-i);
		printf("%.2lf\n",f[0]);
	}
	return 0;
}

luogu4450 收集邮票

有n种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第k张邮票需要支付k元钱。
现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。

==期望dp是真的神

做过SPOJ1026FACDICE 就可以知道 若费用为1时,即求期望买多少次能买到每一种邮票

\(f_i\)表示已经收集了\(i\)张 还期望买多少次才收集齐 \(f[i]=\frac in*f[i]+\frac{n-i}nf[i+1]+1=f[i+1]+\frac n{n-i}\)

同理我们可以想到 设\(g[i]\)表示已经收集了\(i\)张 还期望花费多少钱次才能收集齐

\(\begin{align*}g[i]=\frac in(g[i]+f[i]+1)+\frac{n-i}n(g[i+1]+f[i]+1)=g[i+1]+f[i+1]+\frac{i*f[i]+n}{n-i}\end{align*}\)

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	rd(n),f[N]=g[n]=0;
	for(int i=n-1;i>=0;--i)
		f[i]=f[i+1]+((double)n/(n-i)),g[i]=g[i+1]+f[i+1]+((double)i*f[i]+n)/(double)(n-i);
	printf("%.2f",g[0]);
    return 0; 
}
posted @ 2019-10-08 17:50  委屈的咸鱼鱼鱼鱼  阅读(405)  评论(0编辑  收藏  举报