[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63399955
向大(hei)佬(e)势力学(di)习(tou)
之前一直都没有接触过期望,更别说期望dp了。
先从期望说起吧,dp什么的先不谈。浅谈一下期望的线性性(可加性),这是一个很重要的性质,主要用我做的这几道例题来更感性的理解(真的是浅谈。。。orz)
首先,期望是指一个事件有多种结果,每一种结果出现有一定的可能性。
对于随机变量x,它的期望E(x)=sigma{基本结果i发生的概率*发生基本结果i时的x的数值,i是一个基本结果}
然后是期望的线性性(可加性):
(感性理解一下)
E(X+Y)=E(X)+E(Y)
即两个(或多个)随机变量的和的期望等于期望的和
下面就由题目来理解理解吧(题才是重点):
Codeforces280c
题目大意
给出一棵含n个白点的有根树,每次随机选择一个还没有被染黑的节点,将这个节点和这个节点子树中的所有点染黑.
问期望操作多少次后所有点都被染黑.
N<=100000
整棵树的期望操作次数太大,难以找到方法。这时我们需要突破口。
该如何将大问题转化为小问题呢?我们发现,一棵树是可以分成好几颗子树的,而子树分解的最终状态就是所有的点。那么,我们是不是可以计算出 每个点被染黑的期望操作次数,然后相加就是整棵树的了?答案是当然可以。
这里需要注意的是,对于每个点的操作次数是指的在这个点上的操作。对于每一个点,如果其祖先被染黑了,它自己也会被顺带染黑,而这个对于该点来说是没有进行操作的。所以得出对于点x:E(x)=1/dep[x]
dfs就可以了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100000+5;
int n;
int head[N],end[N*2],nxt[N*2],hh=0;
double ans=0;
void dfs(int u,int f,int dep){
ans+=1.0/dep;
for(int i=head[u];i;i=nxt[i]){
int v=end[i];
if(v==f) continue;
dfs(v,u,dep+1);
}
}
void