Codeforces 696B. Puzzles (概率DP求期望)
来源:互联网 发布:ubuntu ssd 优化 编辑:程序博客网 时间:2024/06/05 04:51
题目链接
简单题意
访问一颗树,在节点上记录访问时间,每次对儿子节点的访问是随机的,问每个节点被访问时间的期望
思路
很显然,如果先访问了兄弟节点,则会把兄弟节点的子树全部访问完成后再来下一次选择。所以要记录一下每个节点中子节点的个数,这个很简单,直接倒着扫一遍邻接表就累加行了。有了子节点的个数,我们还需要得到某一个节点先于其他节点被选择的概率,是0.5
简单说明一下,例如某个节点有a,b,c,d四个子节点,则可能产生24种排列,在所有的排列中,任意一点先于另外一点的概率是0.5,所以对于任意一个点,他先于另外某一个点被访问的概率是0.5。
没有被选中额外花费的时间为父亲的所有子节点数,减去当前节点及其子节点数。
所以得到转移方程为(i是父亲节点,to是儿子结点)
ans[to] = ans[i] + 1 + (sz[i]-1-sz[to]) * 0.5
代码
n = int(input())pos,tree,ans,sz = list(map(int,input().split())) if n > 1 else [],[],[],[]for i in range(n): tree.append([]) ans.append(0.0) sz.append(0)for i in range(n-1): tree[pos[i]-1].append(i+1)for i in range(n)[::-1]: sz[i] = 1 for to in tree[i]: sz[i] += sz[to]for i in range(n): for to in tree[i]: ans[to] = ans[i] + 1 + (sz[i]-1-sz[to]) * 0.5st = lambda i: str(i+1)print(' '.join(list(map(st,ans))))
0 0
- Codeforces 696B. Puzzles (概率DP求期望)
- Codeforces 696B Puzzles 树形期望dp
- Codeforces 696B Puzzles(期望+树形dp)
- Puzzles CodeForces 696B 树形DP 期望计算
- Codeforces Round #362 (Div. 2) B - Puzzles (树上概率dp)
- Codeforces 235B Let's Play Osu! (概率dp求期望+公式变形)
- 概率dp 求期望
- Codeforces-696B Puzzles
- codeforces 183d(期望概率dp)
- poj2096(概率DP求期望)
- hdu3853(概率DP求期望)
- hdu4405(概率DP求期望)
- zoj3640(概率DP求期望)
- hdu3538(概率dp求期望)
- Codeforces 513C Second price auction 概率dp 求期望
- codeforces 498B. Name That Tune (概率与期望DP+快速幂)
- codeforces 398 B. Painting The Wall (概率与期望DP)
- codeforces 235B. Let's Play Osu! (概率与期望DP)
- Android 代码中setTextColor
- c++内存
- poj1160Post Office
- Linux下查看磁盘分区命令详解
- socket编程_tcp协议_客户端
- Codeforces 696B. Puzzles (概率DP求期望)
- openjdk 与 jdk 区别
- 用php遍历目录下的文件
- CF-697BBarnicle与691CExponential notation
- scala学习笔记二
- start—py(1、函数)
- C语言函数sscanf()的用法
- 2016.07.16【初中部 NOIP提高组 】模拟赛C
- 漫步微积分四——导数的定义