嗑瓜子题解 一种期望问题容易陷入的误区
作者:互联网
好吧,其实思路很简单,暴力 \(\mathcal {O}(n^2)\) dp即可。令 \(dp_{i,j}\) 为当前吃了 \(i\) 个瓜子,剩下 \(j\) 个瓜子壳的期望步数。相信有的读者会列出一下方程:
dp[i + 1][j] += (dp[i][j] + 1) * p;
dp[i][j - 1] += (dp[i][j] + 1) * (1 - p);
...
for(int i = 0; i <= 2 * n; i ++) res += dp[n][i];
但是这样会有问题。就是考虑每次转移的时候这条边(相当于边权为 \(1\))最后对答案的贡献是什么。发现不管后面怎么转移,这条边最后的贡献会是 \(p\)(或者 \(1-p\))。但是答案明显不是,因为到达当前点的概率不是 \(1\)。怎么改也很显然。把那个 \(1\) 换成路径上 \(p\) 的前缀积即可。
当然,你也可以直接求概率最后算贡献,这样是严格按照定义来算的,不会错。
dp[i + 1][j] += dp[i][j] * Frac(n - i, 2 * i - (2 * n - j) + n - i) % Mod;
dp[i][j - 1] += dp[i][j] * Frac(2 * i - (2 * n - j), 2 * i - (2 * n - j) + n - i) % Mod;
...
for(int i = 0; i <= 2 * n; i ++) res = (res + dp[n][i] * (n + 2 * n - i) % Mod) % Mod;
标签:嗑瓜子,...,Frac,int,题解,贡献,误区,dp,Mod 来源: https://www.cnblogs.com/Kidulthood/p/15544109.html