zoukankan      html  css  js  c++  java
  • 【专题】概率期望乱写

    概率与期望DP

    绿豆蛙的归宿

    DAG上求起点到重点的期望路径长度

    \(F[i]\) 表示从\(i\)\(n\)的期望步数

    显然\(F[n]\)为零,转移则为

    \(F[i]=\sum_{son(j)}{(F[j]+dis_{i,j})/DEG[i]}\)

    在DAG上做拓扑排序进行转移即可

    较为水


    聪聪和可可

    老鼠的走法就是随机走一个点或者停留

    考虑猫的走法,当鼠猫距离大于二时,猫这一轮一定会走两步,否则这一轮就结束了,猫的走法比较梦幻,所以考虑\(N\)\(dij\),再\(n^2\)预处理出来当猫在\(A\)老鼠在\(B\)时猫的下一步去哪,时间可以承受

    \(F[i][j]\)表示当猫在\(i\)老鼠在\(j\)时的期望值,因为终止状态有很多,而起点只有一个,发现并不好转移,直接记忆化搜索一发

    注意判断特判已经在同一个点的情况


    Easy || OSU!

    题意基本相同
    记录到\(i\)次点击连续o的长度期望,分类讨论本次是否comb转移即可

    OSU中则是需要分别考虑二次和三次的贡献,分别拿两个数组记录,同样讨论本次是否comb转移


    Red is good

    \(F[i][j]\)为当前有\(i\)张红牌\(j\)张黑牌的期望

    当前轮怎么拿牌

    显然对于状态\(F[i][0]\),我一路拿下去肯定最优,直接就是\(F[i][0]=i\)

    同样的状态\(F[0][j]=0\),怎么拿都亏就一张都不拿

    对于F[i][j],我们考虑这一轮拿到了什么牌

    若拿到红牌,则转移到\(F[i-1][j]\),转移到这一状态的概率为\(\frac{i}{i+j}\)

    若拿到黑牌,则转移到\(F[i][j-1]\),转移到这一状态的概率为\(\frac{j}{i+j}\)

    那么就有

    \[F[i][j]=F[i-1][j]*\frac{i}{i+j}+F[i][j-1]*\frac{j}{i+j} \]

    但是题目要求最大值,那么在拿牌过程中,如果我发现我会亏,那我就索性前边的都不要了,从头拿起.即认为前面的牌期望值为0,就相当于F[0][0]

    然后我们快乐的发现可以DP了

    快乐的发现A了


    守卫者的挑战

    \(F[i][j][k]\)为当前进行到的场数,之前赢的场数,和当前背包剩余容量分别为\(i,j,k\)的成功概率

    我觉得并不好转移就记搜了
    当当前场数为\(n+1\)时判一下赢场数和剩余容量是否符合要求即可


    单选错位

    我们发现第\(i\)道题有没有贡献只和它与第\(i-1\)道题的答案是否相同有关,我们只需要相同发生的概率并求和即可,假期望,需要特殊处理一下\(1\)\(n\)


    列队春游

    我们单独考虑每个人的贡献,设当前考虑的人为\(A\)
    对于除他以外的人,发现所有不比他低的人一定不能对他作出贡献(我们认为一定有的贡献1是他自己对自己作出的)

    那么\(A\)产生的贡献实际上就是 \(A前面连续的比A低的人数*发生的概率\)

    设队列中一共有\(m\)个人的身高 ≥ \(A\) 的身高(包括\(A\))

    那么这\(m\)个人无论如何排列都不会对\(A\)产生贡献

    我们再去考虑剩下的\(n-m\)个人对\(A\)的贡献,设人数为\(s\)

    若单独考虑每个人的贡献,因为实际上每个人只能对\(A\)贡献一个单位长度,当这个能对\(A\)产生贡献时,无论其他的人如何排列,都不会影响他对\(A\)产生的贡献,那么我们就考虑这个人什么时候对\(A\)产生贡献

    先排那\(m\)个人,共有\(m!\)种方案,这时我们先将\(s\)中的一个人与\(A\)绑定,视为一个人,参与这\(m\)个人的排列,此时我们保证了这个人一定对\(A\)造成贡献,其他情况一定不会造成贡献

    再考虑剩下的\(s-1\)个人,他们此时不管如何站,都不会再对刚才绑定的那个人的贡献造成任何影响,有\(A_n^{s-1}\)种站法

    至此我们找出了这个人所有可能对\(A\)作出贡献的方案,实际上所有比\(A\)低的人贡献都是如此

    那么\(A\)的贡献就是

    \[(m!*A_n^{s-1}/n!)*s+1 == s/(n-s+1)+1 \]

    扫一遍求和即可


    矩形粉刷

    我们发现\(K\)次粉刷间是有前后影响的,即同一个点可能被粉刷多次但是只贡献一次(虽然我开始并没有考虑这个,然后就发现没法处理了)

    那么我们单独考虑每个格子的贡献,某个格子有贡献,即其至少被粉刷到了一次,我们发现这玩意并不好算,实际上格子是否被刷是对立事件,那么有

    \[ 格子K次都不被粉刷到的概率+格子K次被粉刷到的概率=1 \]

    那么我们求出\(K\)次都不被粉刷的概率就好了,这个显然更好求,即为

    \[ (格子单次不被粉刷到的概率)^k \]

    再考虑这个格子怎么样不会被粉刷到

    某次粉刷到的两个格子都在 上上/下下/左左/右右
    

    但是我们发现 \(上左/上右/下左/下右\) 的概率被算了两次,那么简单容斥一下,减去重复的即可,格子间是没有相互影响的.

    最后用1减去求出的概率即为该格子的贡献,概率值即为期望


    卡牌游戏

    留坑以后写


    换教室

    实际上就是大分类讨论,我们首先需要预处理出来教室两两间的最短距离,跑一遍\(Floyd\)哦了

    发现前面申请成功的概率会对后面算期望造成影响,且需要限制申请次数

    那么设\(F[i][j][0/1]\)表示当前到第几节课,之前已经申请了多少次,本节课是否申请了的期望值

    分类讨论当前是否申请,上一次是否申请了(注意\(j\))
    同时需要讨论这次申请是不是成功了,以及上一次是否成功了(如果申请),因为成功与不成功的距离是不同的,而且申请是有成功概率的,我们不能默认某一次申请成功

    可能说不太明白,可以举例说明但是分类讨论过程太ex了,下次吧(bushi


    奖励关

    状压一下

    \(f[i][j]\)为在第\(i\)回合达到拥有的宝物状态为\(j\)的期望分值

    我们考虑当前状态中每一位\(1\)是第一次出现,还是已经出现过(需要注意回合数的限制)
    分类讨论即可

    好的我们发现这个做法是假的

    惊不惊喜,意不意外

    这样的转移可能会出现,我们需要的上一阶段的状态可能根本是不可达的,因为有宝物先后关系,那么我们考虑逆推,即从一定可达的状态推到之前的状态

    \(F[i][j]\)表示当前\(i-1\)轮所拿到的宝物状态为\(j\)时,第\(i\)轮到第\(k\)轮能获得的最大期望值

    那么我们分别考虑第\(i\)轮会抛出哪个物品,即每次转移都遍历所有物品,若其满足要求,那么有转移式

    \[ F[i][j]+=max \left(F[i+1][j],F[i+1][j|bit]+P_bit \right), bit=1<<(物品编号-1) \]

    即表示当前 \(选/不选\)

    若不满足要求则直接继承\(f[i+1][j]\)即可,当前阶段选不到,下一个阶段也一定选不到

    最后答案即为\(F[1][0]\)


    概率充电器

    一开始没看数据范围以为高消一发就能过,这不嘎嘎切么

    既然高斯消元不行,那么我们就树形DP(题目都明示了)

    考虑每个原件是如何来电的

    他自己来电了 / 他儿子来电了并且通过来了 / 他爹来电了并且通过来了
    

    原件通电的概率是三个事件至少发生一个的概率

    那么就不能直接相加,虽然我第一遍交就是直接相加的,还对了几个点

    有 事件\(A,B\)至少发生一件的概率为

    \[ P(A U B)=P(A)+P(B)-P(A)*P(B) \]

    其实就是简单容斥

    \(d[i]\)为只考虑儿子传导即自己来电时的概率
    \(f[i]\)为所有情况的概率

    第一遍DFS先求出\(d\)数组,把自己的概率以及每个儿子的概率以此用上边的式子算就行

    第二遍DFS考虑加上父亲传导后的概率,显然树根的f和d相同

    \(i\)点时,将他父亲的\(f\)除去\(i\)贡献的部分,再将其视为\(i\)的儿子贡献给\(i\)即可

    注意判断某个原件的概率是不是超过$1$了,当然如果某个点的$d$已经是$1$了,那么就没必要算了,直接赋$1$接着向下搜即可
    

    硬币游戏

    自己想不出来系列

    我们发现这个游戏可能是无穷无尽的,所以状态设定中一定不能包含他在什么位置赢的

    那么我们某个人在什么情况下会赢.

    假设当前的一个未终止局面为\(S\),显然\(S\)完全包含任何一个人的序列.
    我们考虑两个人的情况,假设有\(A=101\),\(B=110\)

    如果局面进行成\(S+A\)那么此时A一定胜出了,但是可能存在一种情况,也就是局面朝\(S+A\)方向进行时,中间出现了形如\(S'+B\)的情况(我们定义S类都是未终止局面),也就是说,在\(A\)胜出之前,已经有\(B\)胜出,提前终止了.

    设出现未终止局面的概率为\(P_0\),如果不考虑提前终止的情况,那么\(P_A = \frac{1}{2^m}*P_0\),实际上这样的话,每个人胜出的概率都如此.

    那么现在考虑如何把提前终止的概率删去,我们发现两两终止状态之间无包含关系,或者可以理解为对立事件,那么说我们在总概率中减去提前终止的那部分概率,就是我们希望的终止局面的概率.

    就考虑提前终止的情况,显然是\(A\)的前一部分和另外某个人的串恰好接上了,字符串意义上就是\(A\)的一段前缀与某个人的一段后缀相匹配,若有长度为\(k\)的串满足,那么提前结束的概率就是\(那个人胜出的概率*序列末尾出现那个人的前(m-k)个字符的概率\)

    这样我们就有\(n\)个方程组,\(n+1\)个为止数,what hell?

    然后我们就死在了寻找最后一个方程的路上

    实际上,当这个游戏无穷尽的进行下去后,一定会有一个人胜出,或者说所有人的胜率和无限趋近于\(1\)

    那么我们就得到最后一个方程了,\(\sum_{i=1}^{n} {P_i} =1\)

    快乐敲一个高消板子欧了

    码完之前不看
    如果你码完又交了一发发现只有40分
    而且后面的点全是零
    ~~去把这句话注释掉~~
    `if(fabs[i][i]<eps)continue`
    

    然后你就A了
    为什么?
    布吉岛(bushi
    我们发现某些系数可能很\(小_{小_{小_{小}}}\),
    小到\(\frac{1}{2^{300}}\),
    好了你把所有的都\(continue\)了,
    所以不能特判

    那真的有0怎么办


    你有喜欢的女孩子嘛 有温柔的女孩子在等你吗
  • 相关阅读:
    Flex随笔
    Flex中实现类似Javascript的confirm box
    正则表达式
    MySQL存储过程
    cvc-complex-type.2.4.a: Invalid content was found starting with element
    Spket在Eclipse/MyEclipse下的安装和配置(图文教程)
    关于安装linux时要怎么分区的考虑的參考方式?
    BZOJ 1975 SDOI2010 魔法猪学院 A*k短路
    使用scipy进行聚类
    Android 下拉刷新上拉载入效果功能
  • 原文地址:https://www.cnblogs.com/Delov/p/15767403.html
Copyright © 2011-2022 走看看