zoukankan      html  css  js  c++  java
  • 【wqy】期望,概率

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

    概率

    概念

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

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

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

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

    • 对于离散变量(X),((P_{(X=K)}=P_{(Xle K)}-P_{(Xleq 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)=Eig((x-E(x))^2ig))

      [V(x)=Eig((x-E(x))^2ig)=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_vfrac1{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 奖励关

    看到(kle15)很容易想到状压

    (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 imes f[i] +frac {n-i}n imes f[i+1]+1)

    (掷到已掷到的概率 imes已掷到i面还期望掷的次数+掷到未掷到的概率 imes掷到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
    ",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)张 还期望花费多少钱次才能收集齐

    (egin{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; 
    }
    
  • 相关阅读:
    Scala中隐式转换(implicit conversion)的优先顺序
    protege4.0使用中的理论
    国外程序员整理的 C++ 资源大全
    什么是本体论?
    深入分析C++引用
    在基于对话框的MFC程序中,使程序在任务栏中不显示图标
    PhoneGap搭建运行环境(3.2版本)
    [JS代码]如何判断ipad或者iphone是否为横屏或者竖屏
    windwos iis 7.5 使用html 报405错误
    NodeJs 开源
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11636880.html
Copyright © 2011-2022 走看看