Codeforces Round #604 (Div. 1) - 1C - Beautiful Mirrors with queries

题意

给出排成一列的 \(n\) 个格子,你要从 \(1\) 号格子走到 \(n\) 号格子之后(相当于 \(n+1\) 号格子),一旦你走到 \(i+1\) 号格子,游戏结束。 当你在 \(i\) 号格子时,你有 \(p_i\) 的概率走到 \(i+1\) 号格子,否则你会返回最近的一个 checkpoint (存档点),最近的存档点是指 \(max\{x|x\leq i \; and \; ischeckpoint(x)\}\) 。对于每个 \(query x\) ,会把 \(x\) 号格子的 checkpoint 属性翻转,然后输出此时从 \(1\) 号格子走到 \(n+1\) 号格子的期望步数。

题解

考虑没有 checkpoint 的情况,也就是 2E 的题意。此时有两种比较好的解法:

  1. \(dp_i\) 表示从 \(1\) 号格子开始,第一次走到 \(i\) 号格子所需的期望步数,则 \(dp_1=0\) ,所求为 \(dp_{n+1}\)
    对于 \(i+1\) 号格子,走到它有两种可能:成功,从 \(i\) 号格子转移;失败,从 \(1\) 号格子转移。
    \(dp_{i+1}=p_i(1+dp_i)+(1-p_i)(1+dp_i+dp_{i+1})\)
    化简,即
    \(dp_{i+1}=\frac{1}{pi}(1+dp_i)\)
    递推可以求解。
  2. \(dp_i\) 表示从 \(i\) 号格子开始,第一次走到 \(n+1\) 号格子所需的期望步数,则 \(dp_{n+1}=0\) ,所求为 \(dp_{1}\)
    对于 \(i\) 号格子,下一步有两种可能:成功,转移到 \(i+1\) 号格子;失败,转移到 \(1\) 号格子。
    \(dp_i=p_i(dp_{i+1}+1)+(1-p_i)(1+dp_1)\)
    则有
    \(dp_n=p_n(dp_{n+1}+1)+(1-p_n)(1+dp_1)\)
    \(dp_{n-1}=p_{n-1}(dp_n+1)+(1-p_{n-1})(1+dp_1)\)
    \(dp_{n-2}=p_{n-2}(dp_{n-1}+1)+(1-p_{n-2})(1+dp_1)\)
    ...
    \(dp_3=p_3(dp_4+1)+(1-p_3)(1+dp_1)\)
    \(dp_2=p_2(dp_3+1)+(1-p_2)(1+dp_1)\)
    \(dp_1=p_1(dp_2+1)+(1-p_1)(1+dp_1)\)

猜你喜欢

转载自www.cnblogs.com/KisekiPurin2019/p/12010101.html