Skip to content
0

概率 DP & 有后效性 DP 笔记

一、概率 DP

1. P2473 [SCOI2008] 奖励关

数据范围显然状压,设 fi,s 表示到了第 i 轮吃了集合 s 宝物的期望值。

但是这样是无法转移的,从前往后转移不知道前面的哪些情况是可行的,哪些情况是不可行的;哪些前置状态概率大,哪些前置状态概率小。

于是就可以想到了从后边向前边转移,因为后边的状态一定是在满足前面的限制条件的情况下,等概率选取的,所以可以直接加起来再除以总数求出期望。

cpp
if ((s & st[j]) == st[j]) // 后面可以多吃 j
    f[i][s] += max(f[i + 1][s], f[i + 1][s | 1 << j] + p[j]);
else // 后面不能多吃 j
    f[i][s] += f[i + 1][s];
f[i][s] = 1.0 * f[i][s] / n;

二、有后效性 DP

1. P3232 [HNOI2013] 游走

先求出每个点的期望经过次数,易得转移方程:

fi={(fv)÷degi+1i=1(fv)÷degii(1,n)

fi(fv÷degi)=[i=1],共有 (n1) 个未知数 fi(n1) 个方程,高斯消元即可,时间复杂度 O(n3)

2. P3750 [六省联考 2017] 分手是祝愿

特殊性质题。

考虑 k=n 时怎么做。容易发现每个按键都不会被若干个按键组合包含,要么是少覆盖了这个按键,要么是多覆盖了更大的按键,而显然不存在一种方案单独消掉更大的按键。所以就是从大到小贪心即可,时间复杂度 O(nn)

有了这个贪心,就很好想到状态 fi 表示还有 i 个按键要按的时候,想按成还剩 (i1) 个键的期望次数,有转移:

fi=in+nin(fi+fi+1+1)

in 的概率恰好按到需要被按的 i 个按键,剩下的情况按到了别的按键,必然要按回来,并且还浪费了这一次数。

稍稍化简:

fi=11nin×i+(ni)(fi+1+1)n

转移即可。求答案时,如果发现贪心出来的次数都小于 k 次了,直接输出,否则就从贪心的次数一直按到只剩 k 次,再加上 k,即 k+i=k+1minfi

3. P5249 [LnOI2019] 加特林轮盘赌

笑点解析:蓝题。

fi,j 表示还剩 i 个人时,i 个人中的第 j 个要开枪人的存活概率,有 f1,1=1

fi,j={P0fi,ij=1P0fi1,j1+(1P0)fi,j12<ji

每一个人开完枪之后,所有人都向前移了一位,然后看第一个人死没死分为两种情况(有没有少了一个人)。

考虑用 f1,1 表示出 fi,i,就要知道每个 fi1,j 被计算了多少次,显然 fi1,j 在计算 fi,j+1+k 时乘了 1P0k(1P0),将 k=ij1 代入,令 A 表示所有 fi1,j 的贡献,则有

A=P0×j=1i1(fi1,j1×(1P0)ij1)

1P0 的次幂可以预处理。

则有 f1,1=(1P0)A+(1P0)i1f1,1

移项就能 n2 算了。

最近更新