概率期望 dp

补新坑,会放到 dp 题目合计部分。

一个朴素的转移 \(P_i = \sum (P_j + w_{i,j}) \times p_{i,j}\),其中 \(w_{i,j}\) 表示转移贡献,\(p_{i,j}\) 表示转移概率。

这个其实就能做很多的期望题了。

高斯消元

简单前置知识,之前怎么学那么多遍没学懂的。

告诉消元的简易思路就是只保留左斜对角线的未知数系数,其余矩阵中的所有数都可以依次消掉。

但是因为保留对角线,所以矩阵会呈现倒三角的形式,此时最后一行只有一个系数,可以解出一个未知数,之后倒数第二行就可以求了,依次类推。

高斯消元的过程也很简单,对于同一行内,其实就是对一个方程的系数消除,比如有 \(ax + by + cz = k\),我们以 \(x\) 为主元,那么方程等价于 \(x + \frac{b}{a}y + \frac{c}{a}z = \frac{k}{a}\)

矩阵列变换其实就是对两个方程同时消除,比如我们已知 \(ax+by+cz = k\),此时有另一个方程 \(2ax +by + cz = k'\),那么我们可以将第二个方程变换为 \(-by-cz=k'-2k\)

这就是高斯消元的做法了,附个代码。

fo(1,i,n)
{
  ll r=i;fo(i+1,j,n) if(fabs(a[j][i])>fabs(a[r][i])) r=j;
  if(fabs(a[r][i])<eps) return printf("No Solution\n"),0;
  if(r!=i) swap(a[r],a[i]);
  db opt=a[i][i];
  fo(i,j,n+1) a[i][j]/=opt;
  fo(i+1,j,n)
  {
  	db opt=a[j][i];
  	fo(i,k,n+1) a[j][k]-=opt*a[i][k];	
  }	
} 
ans[n]=a[n][n+1];
Fo(n-1,i,1)
{
  ans[i]=a[i][n+1];
  fo(i+1,j,n) ans[i]-=a[i][j]*ans[j];
}

At_abc280_e

初始值 \(k\),每次有 \(p\) 概率 \(-2\),有 \((1-p)\) 概率 \(-1\),求减到 \(\leq 0\) 的期望步数。
\(1 \leq n \leq 2\times 10^5,0 \leq p \leq 100\)

不妨设 \(f_i\) 表示值为 \(i\) 时的期望步数,倒着来看,\(f_0 = 0\)

之后有转移 \(f_i = P(f_{i-2}+1)+(1-P)(f_{i-1}+1)\),复杂度 \(O(n)\)

Submission

P4316

一张 DAG 图,从 \(1\) 开始,假设 \(i\) 点有 \(k\) 条出边,那么有 \(\frac{1}{k}\) 的概率走到其中任意一个,求走到 \(n\) 的期望路径长度,保证了终点为 \(n\)
\(1 \leq n \leq 10^5\)

正推可以,但我们考虑倒推,设 \(f_i\) 表示从 \(i\) 点到 \(n\) 点的期望路径长度,\(f_n\) 显然为 \(0\)

这样做的原因其实也就是正推的话 \(f_v\) 还没有求出,不好转移。所以对于倒推,我们有转移 \(f_v = \frac{1}{deg_v}\sum (f_u+1)\)

Submission

P3232

上一题的强化版,无向图,要求对所有边重编号,走过一条边获得的期望长度为其编号,求重编号使到 \(n\) 的期望长度最大。
\(1 \leq n \leq 500\)

转化一下问题,边期望经过次数越多,肯定附的编号越大,但是边的期望次数不好搞,我们将其转成点经过次数,设 \(f_i\) 表示 \(i\) 点的期望经过次数。

那么对于一条边,其期望经过次数为 \(g_i = \frac{f_u}{deg_u} + \frac{f_v}{deg_v}\)

所以我们将问题转化成了点,考虑点的转移 \(f_u = \sum \limits_{edge(u,v),u,v \notin \{1,n\}} \frac{(f_v + 1)}{deg_v} + [u = 1]\)

然后写下来系数高消转移即可。

Submission

P1850

一张 \(v\) 个点 \(e\) 条边的图,轮流前往 \(n\) 个地点 \(c_i\),拥有 \(m\) 次交换的权力,一次可以将前往的地点改为 \(d_i\),求最短路径长度。
\(1 \leq v \leq 300,1 \leq e \leq 9\times 10^4,1 \leq n,m \leq 2\times 10^3\)

Floyd 做出来最短路径,然后状态设计很套路,设 \(f_{i,j,0/1}\) 表示第 \(i\) 个点,进行了 \(j\) 次交换,第 \(i\) 个点有没有进行交换。

转移显然,分类讨论上一个有无交换,乘上概率,就做完了,复杂度 \(O(v^3 + nm)\)

Submission

CF24D

\(n\)\(m\) 列的矩阵,现在在 \((x,y)\),每次等概率向左,右,下走或原地不动,但不能走出去,问走到最后一行期望的步数。
\(1 \leq n \leq 10^3\)

不能向上走是一个突破点,考虑 \(f_{i,j}\) 表示在 \((i,j)\) 点时的期望步数。

一个显然的转移 \(f_{i,j} = \frac{1}{4}(f_{i,j} + f_{i+1,j} + f_{i,j-1} + f_{i,j+1})+1\),注意讨论一下左右边界情况。

发现这个东西可以直接高斯消元,复杂度 \(O(n^6)\),无法通过。

发现转移中没有关于上一行的,而如果我们倒着做,那么 \(f_{i+1,j}\) 就变成了常数,所以我们可以枚举行再转移,此时重新观察一下矩阵的形态,发现是:

\[\begin{bmatrix} 2 &-1 &0 &0 &0 \\ -1 &3 &-1 &0 &0 \\ 0 &-1 &3 &-1 &0 \\ 0 &0 &-1 &3 &-1 \\ 0 &0 &0 &-1 &2 \end{bmatrix} \]

这种特殊的矩阵形态,我们每次只需要消掉这一行和下一行的三个数就好了,于是我们能发现此时一个 Guass 是 \(O(n)\),总复杂度 \(O(n^2)\),可以通过。

Submission

P8774

\(0\) 点开始,有 \((1-p_i)\) 概率向右走一步,有 \(p_i\) 概率回到 \(0\) 点,求到达 \(n\) 的期望步数。
\(1 \leq n \leq 10^6\)

还是倒着来看,设 \(f_i\) 表示 \(i\)\(n\) 的期望步数,那么有 \(f_i = (1-p_{i+1})f_{i+1} + p_{i+1}f_0 + 1\)

这个东西根本没法转移,但是我们考虑 \(f_0 = (1-p_1)f_1 + p_1f_0 +1\)\(f_1 = (1-p_1)f_2 + p_2f_1 + 1\)

将第一个式子套进第二个式子里面,依次类推,我们可以发现 \(f_0\) 的递推式,这题就做完了,懒一点,不写了,复杂度 \(O(n)\)

Submission

P4284

一棵树,每个点有 \(q_i\) 概率通电,每条边有 \(p_i\) 概率可以导电,求通电点数的期望。
\(1 \leq n \leq 2\times 10^5\)

好题。

考虑答案统计,\(ans = \sum P_i \times w_i\),发现所有 \(w_i =1\),所以题目就是求所有 \(\sum P_i\),我们只需要求出每个点的通电概率即可。

这样的话,考虑换根,设 \(f_i\) 表示 \(i\)不通电 的概率,\(g_i\) 表示以 \(i\) 为根时 \(i\) 不通电的概率。

\(f_i\) 子树内转移比较简单,就是子树不通电 + 子树通电但不导电,也就是 \(f_i = (1-p_i) \prod \limits_{j \in son_i} f_j + (1-f_j)(1-w_i)\)

考虑子树外怎么做,我们已知 \(g_{fa}\),但是直接转移是会算上重复贡献的,所以我们需要删掉在 \(fa\) 中,\(i\)\(fa\) 的贡献,因为我们是连乘,所以除掉就好了。

具体的,\(P = g_{fa} \frac{f_{fa}}{f_i + (1-f_i)(1-w_{i,fa})}\),注意特判分母。

但这只是 \(i\) 子树外的贡献,我们还需要合并答案,类似刚才 \(f_i\),也就是 \(g_i = P + (1-P)(1-f_i)\)

合并答案时为 \(ans = \sum (1 - f_i g_i)\),复杂度 \(O(n)\)

Submission

posted @ 2025-04-24 17:21  Wei_Han  阅读(24)  评论(0)    收藏  举报