牛客43084A - Monster Killer
题意
有 n(n≤103) 个怪物,每种怪物的抵御力为 ai
初始时,主人公的战斗力为 0,主人公需要按顺序击败这些怪物
在某次战斗中,假设主人公的战斗力为 m,那么有如下情况:
- m=ai,他击败了当前怪物
- m>ai,他击败了当前怪物,并且有 pi 的概率他的战斗力变为 m−1
- m<ai,他无法击败当前怪物,并且有 pi 的概率他的战斗力变为 m+1
给出ai,pi,问:要把所有怪物都击败,所需要的战斗次数的期望
思路1(倒推)
dp[i][j] 代表第 i 轮战斗,主人公有 j 的战斗力。从当前情况开始,一直到击败所有怪物的期望。
dp[i][j]=⎩⎪⎨⎪⎧dp[i+1][j−1]×pi+dp[i+1][j]×(1−pi)dp[i+1][j]dp[ai][j]+(piai−j),j>ai,j=ai,j<ai
思路2(正推)
- f[i][j] 代表:第 i 轮战斗,主人公有 j 的战斗力。出现这种状态的概率
- g[i][j] 代表:第 i 轮战斗,主人公有 j 的战斗力。从起点到该状态的操作次数的期望
转移注意事项
转移时,先转移 f,等待 f 完全转移结束后,再转移 g
具体实现:
设 s1,s2,s3 为之前的状态,p1,p2,p3 为之前的状态对应的概率,e1,e2,e3 为之前的状态对应的期望,q1,q2,q3 为之前的状态能转移到当前状态的概率。
s 为当前状态,p 为当前的状态对应的概率,e 为当前的状态对应的期望。
⎩⎪⎪⎪⎨⎪⎪⎪⎧s1(p1,e1,q1)s2(p2,e2,q2)s3(p3,e3,q3)…=s(p=p1⋅q1+p2⋅q2+p3⋅q3+…,e=p1⋅q1+p2⋅q2+p3⋅q3+…e1⋅p1⋅q1+e2⋅p2⋅q2+e3⋅p3⋅q3+…)