概率dp入门小结

概率dp是一类求期望/概率的题目
简单总结一下做法
对于求期望
1.先将状态定义出来
2.然后对于每一个状态 u u u,考虑他可能的下一个状态 v v v,于是从 u u u v v v连一条概率为 p u v p_{uv} puv的边。于是写出一个方程

  • d p [ u ] = ( ∑ d p [ v ] ∗ p [ u ] [ v ] ) + 1 dp[u]=(\sum{dp[v]*p[u][v]})+1 dp[u]=(dp[v]p[u][v])+1

  • 假如这是一个DAG,那么这是个水题,倒着推回去就结束了。

  • 假如不是一个DAG,那么可能会有下面这些东西

    • 自环
    • 一条连回某个固定点的边
    • 一条连回根据当前点确定的某个点的边
    • 更多。。。
  • 那么一种思路是要转化成一个DAG,在写出方程后:

    • 自环:移项,消掉
    • 把那些不和谐的边拆出来,设一个参数方程:
    • d p [ i ] = A 1 [ i ] d p [ f 1 ( i ) ] + A 2 [ i ] d p [ f 2 ( i ) ] + . . . A n [ i ] d p [ f n ( i ) ] + B [ i ] dp[i]=A_1[i]dp[f_1(i)]+A_2[i]dp[f_2(i)]+...A_n[i]dp[f_n(i)]+B[i] dp[i]=A1[i]dp[f1(i)]+A2[i]dp[f2(i)]+...An[i]dp[fn(i)]+B[i]
    • 其中 f k ( i ) f_k(i) fk(i)是那些异常点,那些拓扑序靠后的点都被扔进了 B [ i ] B[i] B[i]里,然后把这一坨东西丢进刚开始写出的那个方程的右边,把 d p [ v ] dp[v] dp[v]都代换掉,就会写出来一个参数为 i i i的参数方程,接下来问题转换为求 A t [ i ] A_t[i] At[i],看一下同类项,就可以把参数的递推式写出来。

对于求概率,类似期望,不过要正着推;比较好考虑的的一个原因是结束点到结束点的期望肯定是零,而最初状态的概率一般是好算的。

你可能感兴趣的:(dp-概率dp)