对于概率dp,我一直都弄得不是特别明白,虽然以前也有为了考试去突击过,但是终究还是掌握得不是很好,所以决定再去学习一遍,把重要的东西记录下来。
1.hdu4405
Description
在一个 \(1*n\) 的格子上掷色子,从 \(0\) 点出发,掷了多少前进几步,同时有些格点直接相连,即若 \(a\) ,\(b\) 相连,当落到 \(a\) 点时直接飞向 \(b\) 点。求走到 \(n\) 或超出 \(n\) 期望掷色子次数
\(n \leq 100000\)
Solution
这道题目有助于理解为什么期望通常是逆推的。
因为到达每一个格子的方案很多,但是从每一个格子出去的方案则是确定的。
2.hdu4418
Description
一个人站在编号为 \(0..n-1\) 的数轴上来回走动(假设 \(n\) 为 \(4\) ,那么,它的走动线路为 \(0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, ...\) ),以 \(p[i]\) 的概率走 \(i\) 步 \((i∈[1,m],且∑p[i]=1)\) ,给出 \(n,m\) 以及起点和终点,求出这人走到终点的期望步数。
\(n,m \leq 100\)
Solution
这个上面写得蛮详细的,我就偷一下懒吧。
博客
3.hdu4336
Description
在每包零食里面,可能有一张卡片,也可能没有。已知有总共有n张卡片,第i张的卡片出现的可能是 \(p_i\)。 问收集齐所有的卡片需要吃的零食数的期望是多少。
\(n \leq 20\)
Solution
根据全期望公式,可以得到
\[E[i]=\sum_{j \notin i} p[j]*(1+E[i|(1<<j)])+(1-\sum_{j \notin i}p[j])*(E[i]+1)\]
4.poj2151
Description
有n支参赛队,共有m道题目。组委会期望,每一个参赛队至少解决1道题目,并且冠军队,至少解决t道题目。给出每个参赛队解决每道题目的概率,求满足期望的概率为多少。
\(n \leq 1000,m \leq 30\)
Solution
不难设出这样的 \(dp\) 方程,设 \(dp[i][j][k]\) 为第 \(i\) 支参赛队伍,当前做到了第 \(j\) 道题目,一共解决了 \(k\) 道题目的概率。转移也很显然:
\[dp[i][j][k]=dp[i][j-1][k-1]*p[i][j]+dp[i][j-1][k]*(1-p[i][j])\]
然后
\[p_1=\prod_{i=1}^{n}(\sum_{j=1}^{m}dp[i][m][j])\]
\[p_2=\prod_{i=1}^{n}(\sum_{j=1}^{t-1}dp[i][m][j])\]
\[Ans=p_1-p_2\]
5.hdu4035
Description
有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树,从结点1出发,开始走,在每个结点i都有3种可能:
1.被杀死,回到结点1处(概率为ki)
2.找到出口,走出迷宫 (概率为ei)
3.和该点相连有m条边,随机走一条
求:走出迷宫所要走的边数的期望值。
\(n \leq 10000\)
Solution
网上到处都是。
6.hdu4089
Description
有n个人排队等着在官网上激活游戏。Tomato排在第m个。
对于队列中的第一个人。有一下情况:
1、激活失败,留在队列中等待下一次激活(概率为p1)
2、失去连接,出队列,然后排在队列的最后(概率为p2)
3、激活成功,离开队列(概率为p3)
4、服务器瘫痪,服务器停止激活,所有人都无法激活了。
求服务器瘫痪时Tomato在队列中的位置<=k的概率
\(n \leq 2000\)
Solution
设 \(dp[i][j]\) 为当时队列*有 \(i\) 个人排队,Tomato排在第 \(j\) 个,系统瘫痪时的他的排名小于等于 \(k\) 的概率。我们最后需要求的答案,就是 \(dp[n][m]\)
\(dp\) 方程很显然:
\[j==1:dp[i][1]=p_1*dp[i][1]+p_2*dp[i][i]+p_4*1\]
\[2 \leq j \leq k:dp[i][j]=p_1*dp[i][j]+p_2*dp[i][j-1]\]
\[+p_3*dp[i-1][j-1]+p_4*1\]
\[k<j \leq i :dp[i][j]=p_1*dp[i][j]+p_2*dp[i][j-1]+p_3*dp[i-1][j-1]\]
7.poj2096
Description
一个软件有s个子系统,会产生n种bug
某人一天发现一个bug,这个bug属于一个子系统,属于一个分类
每个bug属于某个子系统的概率是1/s,属于某种分类的概率是1/n
问发现n种bug,每个子系统都发现bug的天数的期望。
Solution
dp[i][j]表示已经找到i种bug,j个系统的bug,达到目标状态的天数的期望
dp[n][s]=0;要求的答案是dp[0][0];
8.poj3744
Description
在一条路上,起点在1处。在N个点处布有地雷,\(1 \leq N \leq 10\)。地雷点的坐标范围:\([1,100000000]\)
每次有p的概率前进1步,1-p的概率前进2步。问顺利通过这条路的概率。就是不要走到有地雷的地方。
Solution
设 \(dp[i]\) 为到达 \(i\) 号点的概率。
那么很显然可以得到:
\[dp[i]=p*dp[i-1]+(1-p)*dp[i-2]\]
但是由于坐标的范围非常大,所以需要矩阵优化。
设 \(x\) 数组中保存所有地雷的坐标,矩阵为 \(S\)
所以
\[dp[x[n]+1]=\prod_{i=1}^{n}(1-S^{x[i]-x[i-1]-1})\]
最后矩阵优化就好了
9.bzoj2134
Description
一次考试,共 \(n\) 道题目,gx每道题目均做对了,可是他把答案抄到答题纸上时抄错位了:第i道题目的答案抄到了答题纸上的第i+1道题目的位置上,特别地,第n道题目的答案抄到了第1道题目的位置上。他想知道自己期望能做对几道题目。
Solution
由于一题只会对下一题产生影响且相互独立,可以考虑求出一道有a个选项的题写到有b个选项的题时的期望得分。
如果 \(a>b\),那么有 \(\frac{b}{a}\) 的概率选项在 \(1...b\) 之间,并且有 \(\frac{1}{b}\) 的概率正确,因此期望为 \(\frac{1}{a}\)
否则可以类似得到期望为 $ \frac{1}{b}$ 。因此期望就是\(\frac{1}{max(a,b)}\)
10.bzoj3450
Description
一个含有 \(o\) , \(x\) , \(?\) 的序列,分数等于所有连续的 \(o\) 的个数的平方和,\(?\) 可以成为 \(o\) 或者 \(x\) 且各有 \(0.5\) 的概率
比如 \(oo?xx\) 的话,\(?\) 是 \(o\) 的话就是 \(oooxx\) 分数为9,是 \(x\) 的话就是 \(ooxxx\) 分数为4
期望自然就是 \((4+9)/2=6.5\) 了
Solution
设 \(L\) 为当前连续 \(o\) 的长度。
那么,当遇到 \(x\) 的时候,\(L\) 归零
遇到 \(o\) 的时候, \(L\) 加一,对答案产生的贡献为 \((L+1)^2-L^2=2*L+1\)
遇到 \(?\) 的时候,以为还要乘上 \(0.5\) 的概率,所以 \(L=\frac{L+1}{2}\) 对答案的贡献为 \(\frac{2*L+1}{2}\)
11.bzoj2337 [HNOI2011]XOR和路径
Description
给你一幅无向图 , 一条路径的权值为路径上边权的异或和,你在每个点可以等概率的走向相连的点,求 \(1 \to n\) 路径权值的期望(有自环重边)
\(n \leq 100,m \leq 10000\)
Solution
因为每一位都是独立的,所以考虑按位处理,求出每一位是 \(1\) 的概率
还是按照套路设 \(f[u]\) 表示 \(u\to n\) 的路径这一位为 \(1\) 的概率, \(dg[u]\) 表示 \(u\) 的出度
那么 \(1-f[u]\) 就是 \(u\to n\) 的路径这一位为 \(0\) 的概率
\[\forall_{(u,v)\in E}\ f[u]=\frac1{dg[u]}(\sum_{w(u,v)=0}f[v]+\sum_{w(u,v)=1}1-f[v])\]
\[\Rightarrow\forall_{(u,v)\in E}\ dg[u]f[u]=\sum_{w(u,v)=0}f[v]+\sum_{w(u,v)=1}1-f[v]\]
\[\Rightarrow dg[u]f[u]-\sum_{w(u,v)=0}f[v]+\sum_{w(u,v)=1}f[v]=\sum_{w(u,v)=1}1\]
高斯消元即可
\(ans=\sum_i2^if_i[1]\)
12.bzoj3143 [HNOI2013]游走
Description
一个无向简单连通图,顶点从1编号到N,边从1编号到M。
初始时小Z在1号顶点,每一步小Z以相等的概率随机选择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z到达N号顶点时结束,总分为所有获得的分数之和。现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。
$N \leq 500 $
Solution
这道题的基本思路是,首先求出每一条边经过的概率,然后对于概率大的边分配小的编号就可以了。
如何求出每一条边的概率?
\[p(u,v)=\frac{p[u]}{cnt[u]}+\frac{p[v]}{cnt[v]}\]
如何求出每一个点的概率?
\[p[u]=\sum \frac{p[v]}{cnt[v]}\]
其中
\[p[n]=0\]
高斯消元即可。
13.bzoj4872 [六省联考2017]分手是祝愿
Description
B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,灯的下标为从 1 到 n 的正整数。每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉。
但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变。
B 每次等概率随机操作一个开关,直到所有灯都灭掉。但是如果当前局面,可以通过操作小于等于 k 个开关使所有灯都灭掉,那么他将不再随机,直接选择操作次数最小的操作方法(这个策略显然小于等于 k 步)操作这些开关。
B 君想知道按照这个策略的操作次数的期望乘以 n 的阶乘对 100003 取模之后的结果。
\(0 \leq k \leq n \leq 100000\)
Solution
设 \(dp[i]\) 为要达到全部熄灭的目标状态需要走 \(i\) 步,到需要走 \(i-1\) 步的期望步数,通过观察推理易知:这 \(i\) 步的先后顺序对答案并没有影响。
那么,不难写出转移:
\[dp[i]=\frac{i}{n}*1+(1-\frac{i}{n})*(1+dp[i+1]+dp[i])\]
化简之后,可以得到:
\[dp[i]=\frac{n+(n-i)*dp[i+1]}{i}\]
14.bzoj2830 [SHOI2012]随机树
Description
\(n \leq 100\)
Solution
对于第一个小问
设 \(dp[i]\) 为当前有 \(i\) 个叶子节点,叶子节点平均深度的期望值。
那么,可以得到
\[dp[i]=\frac{1}{i}(dp[i-1]*(i-1)+(dp[i-1]+1)*2-dp[i-1])\]
化简之后可以得到
\[dp[i]=dp[i-1]+\frac{2}{i}\]
对于第二个小问
设 \(dp[i][j]\) 为形成共有 \(i\) 个叶子节点深度为 \(j\) 的树的操作概率。枚举左右子树各有多少叶子节点就可以了。
15.bzoj5305 [HAOI2018]苹果树
Description
一棵苹果树, 树上每个结点都有恰好两个分支.每一天这棵树都会生长出一个新的结点.
第一天的时候, 果树会长出一个根结点, 以后每一天,果树会随机选择一个当前树中没有长出过结点的分支,然后在这个分支上长出一个新结点, 新结点与分支所属的结点之间连接上一条边.
小 C 定义一棵果树的不便度为树上两两结点之间的距离之和, 两个结点之间的距离定义为从一个点走到另一个点的路径经过的边数.
现在他非常好奇, 如果 N 天之后小 G 来他家摘苹果, 这个不便度的期望 E 是多少. 但是小 C 讨厌分数, 所以他只想知道 E×N! 对 P 取模的结果, 可以证明这是一个整数.
\(n \leq 2000\)
Solution
这道题我开始乱七八糟地想了一大堆东西,但是......
答案为
\[\sum_{i=2}^{n}\sum_{size=1}^{n-i+1}size(n-size)size!C_{n-i}^{size-1}(i-1)i(n-size-1)!\]