首页 > 其他分享 >概率DP

概率DP

时间:2024-10-23 12:01:16浏览次数:7  
标签:概率 up son down fa DP

  • 概率DP是DP中一个非常重要且较难的DP类型。其题型灵活多变,尤其爱与树形DP结合,同时很可能需要各种数据结构优化。
  • 其主要考点便是DP方程的建立与维护。由于“概率”二字,许多时候分类讨论与小数运算也是不可避免的。
    因此,概率DP对选手的逻辑思维与代码能力也有很高的要求,可以说是DP中的集大成者。

P2081 [NOI2012] 迷失游乐园

  • 题意:给定一颗有 \(n\) 个点的树或基环树,每条边有边权 \(w_i\)
    求从每个点开始,在树上随机不重地走,最后的期望经过的边权和。
    对于每个节点,其下一步走到其任意相邻点的概率是相同的。
  • 数据范围 \(n\le 1e5,w_i \le 100\)

普通树

先考虑在普通的树上怎么做。假设我们先钦定 \(rt\) 为根节点,那么对于每个除根以外的节点,其第一步的走法有两种:

  1. 向父亲走
  2. 向儿子走
    容易发现,如果我们已经求出这个点所有儿子再向下走的概率,那这个点向儿子走的概率转移是朴素的。
    设第一步向下走的期望权值为 \(down_u\),则有

\[{\Large down_u=\frac{\sum_vdown_v+w_{u,v}}{son_u}} \]

  • 其中 \(son_u\) 代表 \(u\) 的儿子个数,\(v\) 代表 \(u\) 的某一个儿子。
    而向父亲走的情况稍微复杂了一点。由于这个点走向父亲后还能再向其其他儿子走,也可以继续向上,因此情况要考虑完全
    设 \(u\) 第一步向上的期望权值 为 \(up_u\),则有

\[{\Large up_u=w_{u,k}+\frac{up_k\cdot fa_k+down_k\cdot son_k-down_u-w_{u,k}}{son_k+fa_k-1}} \]

  • 其中 \(k\) 是 \(u\) 的父亲,\(fa_k\) 是 \(k\) 父亲的数量。这听起来可能有些奇怪,因为普通树只有一个或没有父亲。
    不过在一会要讨论的基环树中,\(fa_u\) 就能体现出作用
  • \(up_k\cdot fa_k\) 是继续向上走的贡献,\(down_k\cdot son_k\) 是 \(k\) 又向下走的贡献。
    但因为不能重复走到 \(u\) 点,因此需要减去贡献。注意上面是总的贡献,因此可以直接减
    最后,因为不能走回 \(u\),因此总共有 \(son_k+fa_k-1\) 种情况。
  • 由于 \(up_u\) 需要由 \(down_u\) 与 \(down_k\) 推出,因此对于普通树,先求 \(down\) 再求 \(up\) 即可。
    但需要注意根节点没有父亲,因此处理 \(up\) 时,注意从根节点的所有儿子开始处理。
点击查看代码
void make_down(int u,int k)
{
	for(int i=0;i<tot[u];i++)
	{
		int v=q[u][i].v;if(vis[v]||v==k) continue;
		fa[v]=1;make_down(v,u);son[u]++;down[u]+=1.0*(down[v]+q[u][i].w);
	}
	if(son[u]) down[u]=down[u]/son[u];
}
void make_up(int u,int k,ld w)
{
	up[u]=w;
	if(fa[k]+son[k]-1)
	up[u]=up[u]+(up[k]*fa[k]+down[k]*son[k]-down[u]-w)/(son[k]+fa[k]-1);
	for(int i=0;i<tot[u];i++){
		int v=q[u][i].v;if(v==k||vis[v]) continue;
		make_up(v,u,q[u][i].w);
	}
}
void work1()
{
	make_down(1,0);
	for(int i=0;i<tot[1];i++) make_up(q[1][i].v,1,q[1][i].w);
}

基环树

  • 可以先画个图。
    基环树
  • 红边是环上的边。可以发现,如果我们将红边删掉,就是一片森林。因此对

标签:概率,up,son,down,fa,DP
From: https://www.cnblogs.com/allforgod/p/18496085

相关文章

  • AtCoder DP Contest 速通指南
    题单链接这是AT之前办的一场DP专题,里面都是很经典的问题,可以帮助大家复习DP的套路,个人感觉对于巩固基础来说质量很高,建议大家去去联系一下,尽量不要看题解。本博客只讨论了绿色及以上难度的题目,下面是我的题解。ICoins设\(f_{i,j}\)表示扔到了第\(i\)个,有\(j\)个......
  • 【专题】概率期望
    前言期望的计算公式:\[E(X)=\sum_i{i\timesP(x=i)}\]期望的线性性:\[E(X+Y)=E(X)+E(Y),E(kX)=kE(X)\]百事世界杯之旅[SHOI2002]百事世界杯之旅题目描述假设有\(n\)个不同的球星名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢?解:令\(f(i)\)表......
  • TCP与UDP协议
    (1)TCP协议面向连接、可靠、基于字节的传输,IP报头中协议号为6。一般用于对可靠性要求较高的应用。(2)UDP协议无连接、不可靠、基于报文的传输,IP报头中协议号为17。主机不需维持连接状态具有较高的传输效率,可靠性由应用层来提供。TCP报头结构①源端口和目的端口:传输层与......
  • 六种概率数据结构的详细解释及应用场景
    1/BloomFilter用途:测试一个元素是否可能在一个集合中。原理:BloomFilter使用多个哈希函数将元素映射到一个位数组上。如果所有对应的位都被设置为1,则认为该元素可能在集合中。优点:非常节省空间,因为不需要存储实际的元素,只需存储位图信息。应用:在数据库查询优化、网页缓......
  • 杭州 Day 4 上午 状压 dp
    状压一类杂题P1896[SCOI2005]互不侵犯先预处理出一行的所有可能状态\(S\),应当满足\(S\&(S≫1)=0\),因为不能有相邻的国王。用\(f(i,S,j)\)表示考虑了前\(i\)行,第\(i\)行的状态是\(S\),当前已经放了$$个国王的方案数。转移直接枚举第\(i−1\)行的状态\(T......
  • 提高组专题 dp4
    A[PA2021]OddeskidodeskiDP挺显然的,但我推错了……。\[\begin{split}dp_{i+1,j,1}&+=\sum(dp_{i,j,1}+dp_{i,j,0})\timesj\\dp_{i+1,j+1,0}&+=\sumdp_{i,j,1}\times(m-j)\\dp_{i+1,j,0}&+=\sumdp_{i,j,0}\times(m-j)\end{split}\]#include&......
  • 如何隐藏wordpress主题或插件的更新提示
    如何隐藏WordPress主题或插件的更新提示平常在维护WordPress时,有时候会因为一些错误或者兼容性等问题,我们不能马上升级主题或插件到最新的版本,需要保持旧版本,但是这时候会有一个问题就是每次点开后台都会看到非常显眼的小红点,影响后台体验在本文中我们就来说一下如何在不升级的......
  • Woodpecker: 多模态大语言模型的幻觉纠正先锋
    Woodpecker项目简介在人工智能和自然语言处理领域,多模态大语言模型(MLLMs)的快速发展引人注目。然而,这些模型面临着一个严峻的挑战-幻觉问题。所谓幻觉,指的是模型生成的文本内容与输入图像不一致的现象。为了解决这个问题,研究人员提出了各种方法,其中大多数依赖于特定数据......
  • P4170 [CQOI2007] 涂色 区间 dp
    P4170[CQOI2007]涂色区间dp模板题,不理解为什么是蓝。将现在考虑的区间\([l,r]\)分为\([l,k]\)和\([k+1,r]\),如果\(s_l=s_r\)就可以一起涂,少涂一次。方程:\[dp_{l,r}=\min_{k=l}^{r-1}dp_{l,k}+dp_{k+1,r}-[s_l=s_r]\]代码:#include<bits/stdc++.h>usingnamespac......
  • Linux 操作系统 dpkg-trigger 命令介绍和使用案例
    Linux操作系统dpkg-trigger命令介绍和使用案例dpkg-trigger是Debian和基于Debian的Linux发行版(如Ubuntu)中的一个命令,用于管理软件包的触发器。触发器是一种机制,允许软件包在安装、卸载或升级时执行特定操作。命令概述dpkg-trigger命令用于通知系统某个事件的发......