1 条题解

  • 0
    @ 2025-8-24 21:46:50

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar __stdcall
    **

    搬运于2025-08-24 21:46:50,当前版本为作者最后更新于2017-04-03 14:17:34,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    一道不简单的概率和期望dp题

    根据期望的线性性质,容易想到,可以算出每张卡的期望伤害,然后全部加在一起

    手算样例之后发现是正确的,那么我们只要求出每张卡的实际被使用的概率就可以了

    记第ii张卡的实际被使用的概率为fp[i]fp[i]

    那么答案就是

    i=0n1fp[i]d[i]\Large\sum\limits_{i=0}^{n-1}fp[i]\cdot d[i]

    如何求出fp[i]fp[i]

    首先考虑第一张卡的fpfp,也就是fp[0]fp[0],应该为

    fp[0]=1(1p[i])r\Large fp[0]=1-(1-p[i])^{r}

    这个很容易理解,因为(1p[i])r(1-p[i])^r就是这张卡从头到尾始终憋着不出的概率

    那么对于后面的fpfp应该怎么求呢

    有个条件很烦人,就是在每一轮中,出了一张卡的时候立即结束该轮

    那么下面就轮到dp上场啦!

    f[i][j]f[i][j]表示在所有的rr轮中,前ii张卡中一共出了jj张的概率,那么就可以用O(n)O(n)的时间算出fp[i](i>0)fp[i](i>0)

    枚举前i1i-1轮选了jj张牌,那么有jj轮不会考虑到第ii张牌,也就是有rjr-j轮会考虑到第ii张牌

    那么根据上面的分析,1(1p[i])rj1-(1-p[i])^{r-j}就是在rjr-j轮中使用过第ii张牌的概率,式子:

    $\Large fp[i]=\sum\limits_{j=0}^{r}f[i-1][j]\cdot(1-(1-p[i])^{r-j})(i>0) $

    接下来只要写出f[i][j]f[i][j]的转移方程就好了,分两种情况讨论

    第一种,f[i][j]f[i][j]f[i1][j]f[i-1][j]转移过来,即第ii张牌最终没有选,始终不选第ii张牌的概率是(1p[i])rj(1-p[i])^{r-j}

    f[i][j]+=f[i1][j](1p[i])rj(i>0)\Large f[i][j]+=f[i-1][j]\cdot(1-p[i])^{r-j}(i>0)

    第二种,当j>0j>0时,f[i][j]f[i][j]可以从f[i1][j1]f[i-1][j-1]转移过来,表示最终选择了第ii张牌

    这时候,有j1j-1轮没有考虑到第ii张牌,所以考虑到第ii张牌的轮数是rj+1r-j+1,最终选择的概率为1(1p[i])rj+11-(1-p[i])^{r-j+1}

    $\Large f[i][j]+=f[i-1][j-1]\cdot(1-(1-p[i])^{r-j+1})(i>0,j>0) $

    然后就没了,总时间复杂度O(Tnr)O(Tnr),具体细节看代码

    因为洛谷上有点卡时,所以预处理了(1p[i])(1-p[i])的幂

    http://www.cnblogs.com/mlystdcall/p/6661858.html

    • 1

    信息

    ID
    2312
    时间
    1000~2000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者