概率与期望题目总结

· · 个人记录

概率与期望18题联合题解

Part_1:简单期望

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

T1

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

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

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

代码:Link

T2

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

代码:Link

T3

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

代码:Link

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

T4

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

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

Link

T6

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

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

代码:Link

T7

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

代码:Link

Part_2:进阶期望

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

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](1\le i \le n)。有了状态,式子就很好得到了:我们枚举每一张卡片k_i,得到从庄家开始数第d_i个人会死,那么对于每一张卡片所确定出的庄家d_i+1,我们可以求出来当前的人j在该庄家下的排名w_i,这是好求的,然后就dp[i][j]+=dp[i-1][w_i]/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[i-1][j][0/1]dp[i-1][j-1][0/1] 转移而来,由于n\le 300,可以Floyd预处理出两点之间距离,分类讨论一下上一个时间段与当前时间段自己所在的位置,再与概率相乘即可。

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

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

除了转移方程代码有点长

代码:Link

T12

设$dp[i][j]$表示第$i$轮后第$1→i-1$轮状态为$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。

该题的统计思想在本题中会用到,即up-down的树形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]\times p-dp[x]\times dp[y]\times 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]\times p,那么所求的P(B)就是xy作出的除y子树以外的点的贡献。化简式子得到是\frac{dp[x]-dp[y]\times p}{1-dp[y]\times p},在根据概率公式计算即可。

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

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

二次遍历,上下转移!!

代码:Link

T14

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

由于点数较少,而边数过多,因此考虑转化边的期望为点的期望。设连接一边t的两点x,y的期望分别为p_x,p_y,二者的度数分别为d_x,d_y,那么这条边的期望q_t=\frac{p_x}{d_x}+\frac{p_y}{d_y}

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

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

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

T15

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

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

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

式子就容易得出:

dp[x]=\frac{dp[y]}{deg[x]}(w(x,y)==0)+\frac{1-dp[y]}{deg[x]}(w(x,y)==1)

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

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

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

代码:Link

T16

先考虑最优解是什么:

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

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

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

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

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

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

dp状态的设计,往往取决于转移时变化了什么。

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

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

方程是容易的:dp[i]=\frac{i}{n}+\frac{n-i}{n}\times(dp[i]+dp[i+1]+1)

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

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

本题提醒我们:

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

代码:Link

Part_3:毒瘤期望

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

T17

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

T17.1

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

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

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

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

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

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

代码:Link

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

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

发现一个显然的性质,每一个终点的到达,都是由一个无法匹配的串顺着预测匹配m步得到的。因此x_i=\frac{x_0}{2^m}

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

x_0+\sum_{j=1}^{n}dp[j]\sum_{k=1}^{n}\frac{1}{2^{m-k}}[pre_{i,k}=suf_{j,k}]

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

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

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

T18

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

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

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

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

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

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

f[u]=\frac{1}{deg[u]}+\sum_{x \in son[u]}\frac{1+f[x]+f[u]}{deg[u]}

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

g[u]=\frac{1}{deg[fa[u]]}+\frac{1+g[u]+g[fa[u]]}{deg[fa[u]]}+\sum_{{x \in son[fa[u]]} \cap {x \ne u}}\frac{1+g[u]+f[x]}{deg[fa[u]]}

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

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

f[u]={deg[u]+\sum f_x}\ \ \ \ g[u]=g[fa[u]+deg[fa[u]]+\sum f_x

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

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

代码:Link

Part_4:写在最后

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

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