[bzoj1426]收集邮票 期望DP

来源:互联网 发布:中文相似度匹配算法 编辑:程序博客网 时间:2024/06/01 07:25

1426: 收集邮票

Time Limit: 1 Sec  Memory Limit: 162 MB
[Submit][Status][Discuss]

Description

有n种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第k张邮票需要支付k元钱。 现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。

Input

一行,一个数字N N<=10000

Output

要付出多少钱. 保留二位小数

Sample Input

3

Sample Output

21.25

HINT

有点玄
设f[i]表示有了i种邮票还需要的邮票数,g[i]表示还需要的钱数。
先考虑简化版:每张邮票都只需要1元钱,期望的花费?
f[i]=i/n*f[i]+(n-i)/n*f[i+1]+1
但是这时的花费和之前买了多少次有关
我们可以改变一下费用的计算方式,认为买的最后一张邮票的花费为1,倒数第k张的花费为k
g[i]=i/n*(g[i]+f[i]+1)+(n-i)/n*(g[i+1]+f[i+1]+1)
其实(f[i]+1)可以认为是期望价格
#include<iostream>#include<cstdio>#define N 10005using namespace std;double n,f[N],g[N];int main(){scanf("%lf",&n);for( int i = n-1; i >= 0; i-- ) f[i] = f[i+1]+n/(n-i);for( int i = n-1; i >= 0; i-- ) g[i] = g[i+1]+f[i+1]+(n*i)/((n-i)*n)*f[i]+n/(n-i);printf("%.2lf",g[0]);    return 0;}



原创粉丝点击