题解 P4550 【收集邮票】
Update:2020.2.1 发出题解的第二天
初学期望DP,有问题请指出
- 定义状态
众所周知,期望DP的定义状态一般都为已经……还需要……的期望
由于本题需要求的就是
自己得到所有种类的邮票需要花费的钱数目的期望。
那么我们就可以定义一个
这个应该不需要我讲吧qwq
- 状态转移
首先吧这个写在前面
期望公式:
发现
-
买到之前买到过的邮票种类,此时
x=num(i)+1 (种类总数不变),p=\dfrac {i}{n} -
买到之前没有买到过的,此时
x=num(i+1)+1 (总种类数量+1),p=\dfrac {n-i}{n}
注:以上的
根据公式,我们就可以得到关于
化简之后得到状态转移方程:
得到
-
买到之前买到过的邮票种类:此时
x=ans(i)+num(i)+1 (种类+1,总花费=之前花费+本次花费),p=\dfrac {i}{n} -
买到之前没有买到过的,此时
x=ans(i+1)+num(i+1)+1 (同上),p=\dfrac {n-i}{n}
然后我们又轻松地得到了关于
请自行化简
既然我们有了转移方程,那就开写呗
num[n] = 0; ans[n] = 0;
for(int i = n - 1; i >= 0; i--)
{
double p1 = frac(i, n), p2 = frac(n - i, n);
num[i] = (p2 * num[i + 1] + 1) / (1 - p1);
ans[i] = (ans[i + 1] * p2 + num[i] * p1 + num[i + 1] * p2 + 1) / (1 - p1);
}
cout << fixed << setprecision(2) << ans[0];
注:以上的
以上就是中心代码
但是这篇题解并没有完,题解中的几个细节还没有完善别急着抄代码啊
- Q:为什么要在次数和价格的计算过程中
+1
A:在天数的过程中,
- Q:为什么要倒序循环
A:正序循环也是可以的,只需要将状态“已经……还需要……的期望”改成“……需要……的期望”即可,大家不妨去推导试试。
end.