概率与期望题目总结

18

Part1:

这部分期望题目较为简单基础,是期望的练手题,思维难度较小。

T1

基础期望dp。依照定义:期望=概率×贡献做即可。

本题提醒我们:在正向转移发现无法解决,且这些选择都具有多个,难以枚举,因而概率相同时,要考虑逆向dp

事实上,绝大部分的概率dp都是逆向的。逆向dp的实现可以考虑dfs.

代码:Link

T2

本题提醒我们:在遇到高次项的期望贡献时要拆开来看,分别计算一次项对应的贡献。

代码:Link

T3

简单推个小式子即可。能蒙对当且仅当相邻的两题答案一样,相邻两题答案的组合共有a[i]×a[i1]种情况,蒙对有min(a[i],a[i1])种情况,相除就是单个题目的期望,加和得到总期望。

代码:Link

本题提醒我们:期望是线性的,我们可以通过计算每一个样本的期望得到集合里总的期望。

T4

简单题。状态一眼就能设出来,然后依据概率转移即可。

本题提醒我们:当选择的个数是有限、可枚举的且通常概率不尽相同时,我们可以通过枚举每一种情况来正向进行期望dp

Link

T6

简单题。仍然运用期望的线性性质,算出每个格子的期望,小小容斥一下再相加即可。

本题提醒我们:???好像也没什么。就是注意算概率的时候要不重不漏,有时需要容斥等细微处理,以及卡精度问题。

代码:Link

T7

和T2差不多,注意同时要计算len的期望。

代码:Link

Part2:

这部分期望题目难度逐渐上升,是期望的进阶题,具有思维难度,同时还会结合组合、图论等其它知识点,大部分是远古时期省选题目。

T5

思维题。还是先考虑拆总的期望为每个人的期望,再列出式子即可。

后面的方法就很多了,可以暴力拆式子化简,也可以用long double存组合数硬算概率。具体见两篇题解

代码在题解里,就不放了。

T8

显然操作顺序与最终答案无关,因此我们可以先将操作装进结构体排序,将所有包包放在前面,碎片放在后面。因为所有的挑战只有成功/失败两种结果且每种结果概率不等,因此显然是正向dp。容易想到定义dp[i][j][k] 为当前在第i个挑战,一共赢了j场,目前背包有k空间的概率,于是分类讨论赢/输的情况,那分类讨论一下是包包还是碎片,分别转移即可。

本题提醒我们:正向dp的判定,dp设上题目所有的维度,但绝不要设胜负(成功与否),因为这是期望里的一部分!!!

Link

T9

由于在每个节点有多个等概率的选择,因此显然倒序dp。我们可以预处理两点之间距离dis[i][j]和猫猫在位置i,老鼠在位置j的情况nxt[i][j]表示猫猫会走到哪里,然后用记搜实现倒序dp,令猫和老鼠的位置分别是x,y,老鼠下一步可能在z,则式子显然:dp[x][y]+=dfs((nxt[x][y],z)+1)/(deg[y]),所求即为dfs(s,t)

本题提醒我们:几乎所有图上期望都是倒序dp,且一般多用记搜实现。

代码:Link

T10

期望好题。

先判断是正序还是倒序 dp

庄家每次可以等概率选取一张牌,有多个等概率的选择,因此是倒序dp

现在考虑状态怎么设。既然是倒序dp,那就要从最终状态反推回原状态。最后的状态是只有一个人在游戏中,那这个人的胜率就是1,且这个人是庄家。于是我们考虑设dp[i][j]表示目前游戏中有i人,从庄家开始数第j个人的胜率,于是初始状态就可以表示为dp[1][1]=1,所求即为dp[n][i](1in)。有了状态,式子就很好得到了:我们枚举每一张卡片ki,得到从庄家开始数第di个人会死,那么对于每一张卡片所确定出的庄家di+1,我们可以求出来当前的人j在该庄家下的排名wi,这是好求的,然后就dp[i][j]+=dp[i1][wi]/m转移即可。

这道题的难点是设状态。我们之所以这样设,是因为发现了以下两点:

  1. 在设计第二维时,考虑到每一个人在本质上没有区别,有区别的只是庄家这个身份,因此不能简单地按照编号定义每个人,而是要转换思路,以庄家为基准定义每一个人。
  2. 在设计第一维时,如果简单地将作为第一维,那么在倒序枚举的情况下无法确定初始状态,不得不改变一下方式。我们知道初始状态应当是只剩一个庄家,根据刚才对第二维的设计对应的是就是庄家开始的第一个人。第一维应当与时间(轮次)相对应,能随他们而变化的,只有剩余人数这一维度。 因此得到了方程定义和初始状态:dp[1][1]=1

本题提醒我们:难一些的期望dp的关键是设状态。一般地,我们先确定dp顺序,再确定如何表示初始状态,依照这两点来定义dp方程。

代码:Link

dp

T11

先回顾上文写的那句话。

然后——

"[NOIP2016]换教室"默默地向你翻了一个白眼。

先分析dp顺序,由于只有成功/失败两种情况概率各不相同,显然正序dp

有了顺序,状态就好设了。设dp[i][j][0/1]表示第i个时间段,liuliu一共申请了j门课,当前这一门课申请(1),未申请(0)的期望。

千万不要设胜负!!!

转移也非常简单。显然 dp[i][j][0/1] 会由 dp[i1][j][0/1]dp[i1][j1][0/1] 转移而来,由于n300,可以Floyd预处理出两点之间距离,分类讨论一下上一个时间段与当前时间段自己所在的位置,再与概率相乘即可。

本题提醒我们:分类讨论要看全,邻接矩阵存重边要判断边权,全源最短路之间最短路最好用Floyd

整体来看这道题还是进阶期望里挺简单的一道,几乎没有什么期望部分。

除了转移方程代码有点长

代码:Link

T12

n15,一眼状压。等概率的期望,显然逆推。

dp[i][j]表示第i轮后第1i1轮状态为j的期望,一般地,逆序枚举的期望dp初始状态就是0。令每个宝物额前提状态集合为s[i],当前物品是t,那显然得到dp方程:

if s[t] & j ==0  dp[i][j]+=(max(dp[i+1][j],dp[i+1][j & (1<<t)+p[t]])/n

else   dp[i][j]+=dp[i+1][j]/n

本题提醒我们:倒序dp有多种方式图论问题中可以记搜(T1、T9)、可以倒序设状态(T10)、可以倒序枚举(T12)。

代码:Link

T13

假期望,真树形dp.

本题的前置:洛谷P3047

该题的统计思想在本题中会用到,即updown的树形dp思想。

在树形dp维护信息时,很多时候我们需要O(n)维护一个点到全局的信息,这时候就需要该思想。具体地,该思想通过的是两次dfs,第一次的dfs维护根节点向下的信息,第二次维护叶子节点向上到根节点的信息。但显然两次的信息会由重复,那么就需要容斥原理减去重复的一部分。

对于本题:

首次dfs中,令父亲节点为x,儿子节点为y,通过边的概率为p,由概率的计算公式P(A+B)=P(A)+P(B)P(AB),则容易知道dp[x]=dp[x]+dp[y]×pdp[x]×dp[y]×p

第二次dfs中,我们需要计算所有除去y的子树内的点对y处答案的贡献。那这个东西显然可以用x来更新。但此时的dp[x]已然包含了y的子树的部分,因此需要减去。具体地,由公式P(A+B)=P(A)+P(B)P(AB),此处的P(A+B)就是dp[x]P(A)dp[y]×p,那么所求的P(B)就是xy作出的除y子树以外的点的贡献。化简式子得到是dp[x]dp[y]×p1dp[y]×p,在根据概率公式计算即可。

注意当dp[y]×p=1时,该式子无意义,但同时意味着dp[y]已然是1,直接跳过,向下遍历即可。

本题提醒我们:概率计算不重不漏,树形dp要考虑二次遍历,上下转移

!!

代码:Link

T14

注意到是一个有环无向图,无法进行一般的树形转移。

由于点数较少,而边数过多,因此考虑转化边的期望为点的期望。设连接一边t的两点x,y的期望分别为px,py,二者的度数分别为dx,dy,那么这条边的期望qt=pxdx+pydy

考虑如何求点的期望。设点x,y间有边相连,那么期望fx=fydy。由于点n无从转移,因此一共有n1个这样的式子,未知数是fi(1<i<n),考虑高斯消元解出期望。需要注意的是,点1的初始期望为1

然后贪心,期望越大赋值越小即可。

本题提醒我们:图论中的期望可以化边为点,当未知数的转移不具有规律性,不可简单dp时,要高斯消元来解。

T15

与上一道题有相似的地方,但也有不同。

求异或时,显然异或的每一位是互不相关的,因此我们可以分类讨论,求出每一位的期望。

显然这类图论题目都是倒序dp。因此想到设f[i]in的该位异或路径为1时的概率。这里设的时候不能简单设路径的期望,因为只有异或值为1才会对答案做出贡献。

式子就容易得出:

dp[x]=dp[y]deg[x](w(x,y)==0)+1dp[y]deg[x](w(x,y)==1)

略微变形一下,高斯消元log_MAX次即可(一般直接取30 or 31)。

期望dp,初始状态为0,所求即为dp[1]

本题提醒我们:遇到异或这种运算时可以按位处理,设状态的时候要能直接表示出初始状态,由于一个点的异或值可能性有两种,且概率相加为1 (这很重要!到一个点的异或值的样本空间只有01),不然就要像T11一样表示两种情况(期望没有规律啊)!

代码:Link

T16

先考虑最优解是什么:

显然每一次最右边的亮灯是必须要按的(没得选)。于是最优策略就是从大到小枚举每一个亮灯,改变它左边灯的状态。这里O(nn)O(nlogn)都不难做到。

先分析dp顺序。每个灯有多种可能的状态,因此倒序dp

状态怎么设?这是本题最难的地方。

分析题目给的可能的初始条件。在剩余最优策略还有k步时,直接按最优策略走。

这道题应该算一道特殊性质题,因为没有这个k步的条件,题目照样可以做,但状态会难设很多。原因是它提醒了我们每一次按灯有按正确和按错误两种可能性,设状态时可以从按灯正确与否入手。

但是按灯的过程的阶段性不强。上面的题目,一般都有轮数/时间段等限制,可以作为阶段,但是按正确与否的灯,似乎没有这方面的限制。

dp

按一次正确的灯,正确的灯会增加一盏,因此本题变化的是正确的灯的数量!!

我们不能简单的按了i盏正确的灯时的期望,这样错误的灯的个数会影响答案统计。因此,设dp[i]为从有i盏灯需要按到i1盏需要按的期望,这样设隐含着本次按的灯是对的这一条件,就好转移了。

方程是容易的:dp[i]=in+nin×(dp[i]+dp[i+1]+1)

含义是按对的概率(×1) +按错的概率×按错所需的代价。

变形一下统计答案即可,细节见代码。

本题提醒我们:

  1. 关注特殊性质
  2. 关注转移过程中变化了什么,根据变化的量来设dp状态。

代码:Link

Part3:

这部分期望题目,是期望题目中几乎不可做的题,思维难度大。

T17

先讲40pts的部分分,就是该题:

T17.1

两道题本质上是全等的,只有数据范围不同。

有多个模式串,自然想到AC自动机。于是建出AC自动机,对每一个字符串的末尾打上标记,所求就是最终停在每一个标记点的概率。

直接设每个点的概率是不好转移的,因为无法确定初始状态。经过根节点的概率如何求出呢?是1吗?但显然由于可以反复地返回根节点,因此这样是不成立的。

但是我们可以简单地求出经过每个点的期望。这部分是T14。求期望的原因是根据期望的定义,E(i)=P(i)×经过次数,但是本题中,到达终点就停下,这个次数是1啊!因此求出的期望就是概率了。

那么高斯消元即可。由于一共最多可以建出 nm 个点,因此复杂度大致是O(n3m3)的,可以通过该题。

本题提醒我们:多模字符串想到AC自动机,注意概率和期望之间的灵活转化!

代码:Link

回到本题。O(n3m3)的复杂度通过本题显然力不从心。考虑这个算法的冗余部分在哪里。高斯消元后我们求出了每一个自动机上的点的期望,但是所有非终点的期望我们实际上是不需要的。于是考虑把所有非终点构成的集合的期望记作x0,每一个终点的期望(即概率)记作x1n

考虑到达每一个终点的过程。

发现一个显然的性质,每一个终点的到达,都是由一个无法匹配的串顺着预测匹配m步得到的。因此xi=x02m

但这样实际上是不正确的,不然所有的字符串概率应该相同。我们没有考虑在这个匹配路径上遇到其他字符串终点的情况。这样的情况发生意味着匹配字符串i的某个前缀和干扰字符串j的某个后缀完全重合。在x0的基础上加上这个干扰匹配的概率就是这条路径真正的概率了。

x0+j=1ndp[j]k=1n12mk[prei,k=sufj,k]

再结合一个显然的方程:i=1nxi=1,就可以高斯消元解n+1个方程组了。

注意最终要一些奇怪的恒等变形?不然会奇奇怪怪地因为精度炸掉。

本题提醒我们:分析非完美算法失败的原因,考虑非完美算法的冗余在哪里,建立将所有不合法情况看成一种情况的意识

T18

在做了许多难度大的期望之后发现这道题也没有那么毒瘤了呢~~

显然的树形dp。考虑两点之间路径的情况是从起点 xlca 再到终点 y 的。由期望的线性性质,这两个部分我们可以分别计算前缀和、差分处理。于是考虑设 f[u] 为当前节点 ufa[u] 的期望步数,反之 g[u] 为从 fa[u]u 的期望次数。

注意求fg的顺序是不可改变的!

原因是树形结构的特殊限制。从下到上的路径是唯一的,但从上到下的路径有着多种选择,依赖着从上到下的答案。这本质上还是updown思想。

草稿本:那你为什么妄图先算g忙了将近1h

然后式子就好列出了,注意分类讨论要细致。

f[u]=1deg[u]+xson[u]1+f[x]+f[u]deg[u]

这个表示的就是一步走对的可能+走错了,走到子节点,需要多一步返回的可能。

g[u]=1deg[fa[u]]+1+g[u]+g[fa[u]]deg[fa[u]]+xson[fa[u]]xu1+g[u]+f[x]deg[fa[u]]

这个表示的就是一步走对的可能+走到自己父亲节点,需要一步返回的可能+走错儿子,需要一步返回的可能。

这个式子显然无法直接递推处理,因此需要化简一下,就成了:

f[u]=deg[u]+fx    g[u]=g[fa[u]+deg[fa[u]]+fx

递推处理就好了。注意初始化问题:f[1]=g[1]=0以及dfs中的部分细节问题。

本题提醒我们:树上问题大多转化为lca问题,树形dpupdown思想的贯彻导致统计答案的顺序很重要!

代码:Link

Part4:

概率与期望的题单一共18题,做到这里想必也是很不容易。最后总结一下关于概率与期望的几句话吧。

  1. 确定dp顺序,是正序dp还是倒序dp
  2. 设状态很重要。一般地,好的状态能有好的初始状态和所求状态的表示,能够体现转移过程中变化的量
  3. 灵活结合其它算法解决问题。如一般图中用高斯消元,树上用updown思想的树形dp
  4. 勤思考,多写代码,培养强大的思维能力和代码能力,不要一味颓题解!

                                                                                         Thats End. on 2024.2.17

posted @   长安19路  阅读(18)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示