最近觉得期望特别玄学,特地放个博客慢慢整理
仅仅是给自己看,所以文中可能有很多概念性的(+就是错了)的错误,如果有大佬看见还望指出。。。
期望的实际意义
实验重复无数次的平均权值,随着发生次数的上升,最终平均值会无线接近一个数,期望
我的理解
加权平均数。。。
由于这个性质,期望具有线性性,也就是 和的期望 = 期望的和
还有 (E(kx) = k E(x))
这里的 (x_i) 是互不影响的事件
注意, (E(x_1 x_2) != E(x_1)E(x_2))
放到式子里就很好理解
比原来多出来一沓
有一些题目算要求期望,概率很不好算,但是却可以用期望+走一步的概率倒着推出来,这个地方我觉着玄学的一批,很有道理又很没道理,放到以后解决吧
要说期望还顶有概率,关于概率,除了有不连续的还有连续的
关于连续有几个积分式子和定义
一些定义
(P(x), ans = x) 的概率
(p(x) = f'(x), p(x)) 叫连续性随机变量的概率密度函数((p(x)) 越大说明随机变量是 (x) 的概率相对较大)
(f(x), ans <= x) 的概率,叫连续形随机变量的概率分布函数
- (tps:) 如果您要阅读请直接看下面的全概率公式(严谨证明)
(thinking)
如果我要求连续性随机变量落在 ([l, r]) 的概率,(P(l:r) = f(r) - f(l))
有一个式子
假如随机变量的范围是区间 ([l, r]) 落在 (x) 的权值就是 (x),这就更有意思了
最后一步转化要怎么证呢 ? 一个想法是求出原函数
tps:后来才知道上面那玩意是全概率公式。。。
还是简述一下(其实就是上面的东西,可跳过)
全概率公式
随机变量 (x) 的权值是 (x) 且随机落在区间 ([l, r]),设 $f(x) = $ 答案 (ge x) 的概率, 当 ([x(-f(x))]_l^{r+dx} = 0) 时有
设 (P(x)) 为随机变量恰好为 (x) 的概率,(p(x)) 是 (x) 的概率密度函数
证明1
考虑到积分余项,当 ([x(-f(x))]_l^{r+dx} = 0) 时 (E(x) = int_l^r f(x) dx)
证明2(有点抽象且不严格,看看就好)
把这个式子一项一项展开
这个对于 (dx = 1) 的情况同样适用
证毕
下面放一道题
P3343 [ZJOI2015]地震后的幻想乡
题目大意: 每个边有一个 ([0, 1]) 的随机权值,求整张图联通的期望时间
设 (P(t)) 为联通时间为 (t) 的概率,(p) 是概率密度函数,(f) 是概率分布函数 (f(t)) 表示联通时间 (> t) 的概率
很显然题目要求
根据全概率公式
问题来了,怎么求呢?
我们将 (f(x)) 再加个定义 (f_s(x)) 表示几何为 (s) ((s) 是原图的子集,且 (1 in s)) 的子图联通时间 (> t) 的概率
首先 (f_{{1}} = 0)
这里 (|T(s_0, s - s_0)|) 表示 (s_0) 与 (s - s_0) 联通的边数,((1 - f_{s_0}(t))) 是 (t) 时刻 (s_0) 已经联通的概率
用 (all) 表示全集,这样可以把原式子写成
这显然是一个递归形式,它的边界是 (int_0^1 f_{{1}}(t) dt = 0)
下面我们来看更一般的形式
然后这道题就做完了
初始情况为
(code)
#include <bits/stdc++.h>
using namespace std;
#define rg register
// #ifdef ONLINE_JUDGE
// char ss[1 << 17], *A = ss, *B = ss;
// inline char gc(){ if(A == B){ B = (A = ss) + fread(ss, 1, 1 << 17, stdin); if(A == B) return EOF; } return *A++; }
// #define getchar gc
// #endif
inline int read(){
#define G ch = getchar()
rg char G;
rg int x = 0, f = 0;
while(!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return f ? -x : x;
}
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pre(i, a, b) for(int i = a; i >= b; --i)
const int N = 11, M = N * N;
double f[1 << 10][M];
int link[N], sz[1 << 10];
int n, m;
signed main(){
n = read(), m = read();
rep(i, 1, m){
int x = read(), y = read();
link[x - 1] |= 1 << (y - 1);
link[y - 1] |= 1 << (x - 1);
}
int top = 1 << n;
for(int i = 1; i < top; ++i) sz[i] = sz[i & (i - 1)] + 1;
// rep(i, 0, m) f[1][i] = 0;
for(int i = 2; i < top; ++i) if(i & 1){
for(int s = (i - 1) & i; s; s = (s - 1) & i) if(s & 1){
rg int ecnt = 0;
rep(k, 0, n - 1) if((i >> k & 1) & ((~s) >> k & 1)) ecnt += sz[link[k] & s];
rep(j, 0, m - ecnt) f[i][j] += 1. / (j + ecnt + 1) - f[s][j + ecnt];
}
}
printf("%.6lf", f[top - 1][0]);
// cout<<fixed<<setprecision(6)<<f[top - 1][0]<<endl;
getchar(); getchar();
return 0;
}