加特林轮盘赌(特殊消元)

题意简述:有n个东东围成一圈,让它们自杀,每个人自杀的概率是 (p_0) 。(都是一样的)每个人一次紫砂,问第k个东东最后一个紫砂的概率。

SOL:n个东东围成一圈,还要依次紫砂,那么考虑每次紫砂的东东,他有 (p_0) 的概率紫砂,有 (1-p_0) 的概率不紫砂。那么可以把这n个东东围成的圈看做一个队列,紫砂成功就代表消失了,紫砂失败就代表到了队尾。那么由此可以写出dp方程。设当前队列中有i个人,那么第j个人最后一个紫砂的概率就是 (f[i][j]=p_0f[i-1][j-1]+(1-p_0)f[i][j-1]) 。你以为可以dp了吗?nonono。特殊的,对于第1个人而言,方程是这样的 (f[i][1]=p_0*0+(1-p_0)*f[i][i]) 。于是需要解方程。对于每一个 (i) 都有 (n) i个方程。那么使用高斯消元,时间复杂度将会达到惊人的 (O(10000^4)) 。高斯消元这条路走不通了,那就需要观察这个方程组的特殊性。可以发现 (f[i-1][j-1]) 在上一次解方程就可以解出来所以 (p_0f[i-1][j-1]) 可以看作常数项(本来就是,这里多提一嘴)。于是从 (x1) 往上依次代入,可以得到只关于 (x_n) 的方程。 (n^4) 的算法就这样变成了 (n^2) 。牛逼!

原文地址:https://www.cnblogs.com/currytrey/p/15396376.html