0%

ABC-382-E - Expansion Packs

思路讲解

参考以下题解:

https://www.luogu.com.cn/article/z6wql8q2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FOR(i,1,N){cin>>P[i];}
FOR(i,0,N){ // 抽到第i张卡,有多大的概率抽到j张稀有卡
FOR(j,0,N){
if(i>0 && j>0){
// 这第i张没出货 第i张出货了
dp[i][j]=dp[i-1][j]*(1.0-P[i]/100.0)+dp[i-1][j-1]*(P[i]/100.0);
}else if(j==0 && i>0){
dp[i][j]=dp[i-1][j]*(1.0-P[i]/100.0);
}else if(i==0 && j==0){
dp[i][j]=1.0;
}else{ // 剩下的抽0张卡,获得>0张卡的概率自然是0
dp[i][j]=0;
}
}
}

前面这个求抽到第 i 张卡,有多大的概率恰好抽到 j 张稀有卡,还是不难的。

但是这道题目要求的是抽到至少 X 张卡的数学期望,这个的转移有点难,也有点难想。

expi=1+j=0Nexpmax(0,ij)×dp[N][j]exp_i=1+\displaystyle\sum_{j=0}^{N}exp_{max(0,i-j)}\times dp[N][j]

( $ exp_i$ 代表抽到至少 i 张的期望包数,dp[N][j]dp[N][j] 代表该包抽到恰好 j 张稀有卡的概率 )

这个式子初看很难理解,其实细看之下,还是不那么难理解的,1是我这次抽,所以 +1+1,但是我们是要转移的,需要从别的情况转移过来,那从哪些情况那?其实就是从 j=0Nexpmax(0,ij)\displaystyle\sum_{j=0}^{N}exp_{max(0,i-j)} 这些情况转移过来,但是这些转移是有概率的,多大的概率那?dp[N][j]dp[N][j]

当然因为左右两边都包含 expiexp_i 其实我们还要进行一个移项。

expi=1+expi×dp[N][0]+j=1Nexpmax(0,ij)×dp[N][j]expi(1dp[N][0])=1+j=1Nexpmax(0,ij)×dp[N][j]expi=(1+j=1Nexpmax(0,ij)×dp[N][j]) / (1dp[N][0])exp_i=1+exp_i\times dp[N][0]+\displaystyle\sum_{j=1}^{N}exp_{max(0,i-j)}\times dp[N][j]\\ exp_i(1-dp[N][0])=1+\displaystyle\sum_{j=1}^{N}exp_{max(0,i-j)}\times dp[N][j]\\ exp_i=(1+\displaystyle\sum_{j=1}^{N}exp_{max(0,i-j)}\times dp[N][j])\ /\ (1-dp[N][0])

你可能会说,我还是不理解这个 +1+1,或者为什么不是直接用 X/每包的期望稀有卡数量X/每包的期望稀有卡数量。那么我问你,这个得到至少一张稀有卡的期望可能小于 1 吗?不可能吧,因为不可能一包卡都不开就拿到了一张稀有卡吧?所以其实这个 +1+1 就是这里的转移必须要用开卡包来转移。

AC代码

https://atcoder.jp/contests/abc382/submissions/65982174

心路历程(WA,TLE,MLE……)