zoukankan      html  css  js  c++  java
  • P4550 收集邮票 [期望dp]

    P4550收集邮票


    题目描述

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


    Solution

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

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

    G[i]G[i]表示当前持有ii种邮票, 还需要买G[i]G[i]块钱得到N种邮票则
    G[i]=iN(G[i]+F[i]+1)+NiN(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]=iNiF[i]+G[i+1]+F[i+1]+NNiG[i]=frac{i}{N-i}F[i] +G[i+1]+F[i+1]+ frac{N}{N-i}

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


    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
    ", G[0]);
            return 0;
    }
    

  • 相关阅读:
    Javascript加载执行问题探索
    CentOS搭建WordPress
    ORACLE创建表空间,用户及授权
    ApacheCommonsDbutils 学习笔记
    Android SSL BKS证书生成, 以及PFX与JKS证书的转换
    VirtualBox虚拟机CentOS中安装增强插件失败,解决方法
    ORACLE %TYPE与%ROWTYPE
    Java代码调用C#实现的Web服务
    常用的Git命令
    js手机号正则表达式验证
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822687.html
Copyright © 2011-2022 走看看