洛谷4550 收集邮票(期望DP)

本文深入解析了一个经典的邮票收集问题,通过动态规划(DP)方法,详细阐述了如何计算收集全n种邮票的期望操作次数与总花费。文章提供了完整的代码实现,包括初始化数组、递推公式推导及最终结果输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

【题目分析】

   为啥这道题都是道权限题。。。。

   虽然代码很短,但是要想清楚还是很难。

   令f[i]表示当前已经拥有了i种邮票,要拥有n种邮票的期望操作次数。

   那么对于下一次的操作无外乎两种:又一次取到已经得到的邮票和取到新的邮票。

   取到已得到的邮票概率为 i n \frac{i}{n} ni,取到新的邮票的概率为 n − i n \frac{n-i}{n} nni,所以可以得到递推式f[i]=f[i] × \times × i n \frac{i}{n} ni+f[i+1] × \times × n − i i \frac{n-i}{i} ini

   整理一下可得:f[i]=f[i+1]+ n n − i \frac{n}{n-i} nin

   由于计算的是期望操作次数,所以令g[i]表示当前已有i种邮票,要拥有n种邮票的期望花费。

   我们视最后一次的操作花费为1,那么从后向前每增加一次操作次数,花费多1,所以有了期望操作次数后,我们可以得到g[i]的递推式:

   g[i]= i n \frac{i}{n} ni(g[i]+f[i]+1)+ n − i n \frac{n-i}{n} nni(g[i+1]+f[i+1]+1)

   整理一下得到:

   g[i]=g[i+1]+f[i+1]+f[i]* i n − i \frac{i}{n-i} nii+ n n − i \frac{n}{n-i} nin

   最后答案就是g[0]。

【代码~】

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;

int n;
double f[MAXN],g[MAXN];

int main(){
	scanf("%d",&n);
	for(int i=n-1;i>=0;--i)
	  f[i]=f[i+1]+1.0*n/(1.0*(n-i));
	for(int i=n-1;i>=0;--i)
	  g[i]=g[i+1]+f[i+1]+1.0*f[i]*i/(1.0*(n-i))+1.0*n/(1.0*(n-i));
	printf("%.2lf",g[0]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值