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;
    }
    

  • 相关阅读:
    Insus Meta Utility
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    Insus Binary Utility
    asp.net实现文件下载功能
    Column 'Column Name' does not belong to table Table
    程序已被编译为DLL,怎样去修改程序功能
    如何在Web网站实现搜索功能
    如何把数据流转换为二进制字符串
    Asp.net更新文件夹的文件
    如何显示中文月份
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822688.html
Copyright © 2011-2022 走看看