P4550 收集邮票 [期望dp]

P4550收集邮票


题目描述

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


Solution

F [ i ] F[i] F[i]表示当前持有 i i i种邮票, 还需要买 F [ i ] F[i] F[i]次得到N种邮票 则
F [ i ] = i N ( F [ i ] + 1 ) + N − i N ( F [ i + 1 ] + 1 ) F[i] = \frac{i}{N} ( F[i] + 1 ) + \frac{N-i}{N}( F[i+1] + 1 ) F[i]=Ni(F[i]+1)+NNi(F[i+1]+1)
化简得
F [ i ] = F [ i + 1 ] + N N − i F[i] = F[i+1] + \frac{N}{N-i} F[i]=F[i+1]+NiN

考虑使用当前的结果对后面增加的花费列方程, 得到下式.

G [ i ] G[i] G[i]表示当前持有 i i i种邮票, 还需要买 G [ i ] G[i] G[i]块钱得到N种邮票则
G [ i ] = i N ( G [ i ] + F [ i ] + 1 ) + N − i N ( G [ i + 1 ] + F [ i + 1 ] + 1 ) G[i] = \frac{i}{N}(G[i]+F[i]+1) + \frac{N-i}{N}(G[i+1]+F[i+1]+1) G[i]=Ni(G[i]+F[i]+1)+NNi(G[i+1]+F[i+1]+1)
化简得
G [ i ] = i N − i F [ i ] + G [ i + 1 ] + F [ i + 1 ] + N N − i G[i]=\frac{i}{N-i}F[i] +G[i+1]+F[i+1]+ \frac{N}{N-i} G[i]=NiiF[i]+G[i+1]+F[i+1]+NiN

注: 还有类似上方, 站在整体角度, 考虑当前结果对后方影响列方程的题目, 这里 .


Code

#include<bits/stdc++.h>

double F[10005], G[10005];

int main(){
        int N;
        scanf("%d", &N);
        F[N] = 0, G[N] = 0;
        for(int i = N-1; i >= 0; i --) F[i] = N*1.0/(N*1.0-i) + F[i+1];
        for(int i = N-1; i >= 0; i --) G[i] = i*1.0/(N*1.0-i)*F[i] + G[i+1] + F[i+1] + N*1.0/(N*1.0-i);
        printf("%.2lf\n", G[0]);
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值