zoukankan      html  css  js  c++  java
  • hdu4336Card Collector 概率dp+状态压缩

    //给n个卡片每次出现的概率,求全部卡片都出现的须要抽的次数的期望
    //dp[i]表示在状态的情况下到全部的卡片都出现的期望
    //dp[i] = 1 + p1*dp[i] + ${p2[j]*dp[i]} + ${p3[k]*dp[i^(1<<k)]}
    //$表示求和。p1表示没有出现卡片的概率 , p2[j]表示出现的卡片是当前状态已经出现的状态
    //p3表示出现的卡片当前状态没有
    //整理的dp[i] = (1 +  ${p3[k]*dp[i^(1<<k)])/${p3[k]}
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std ;
    const int maxn = 1 << 21 ;
    double dp[maxn] ;
    double p[21] ;
    int main()
    {
        int  n ;
        while(~scanf("%d" , &n))
        {
            for(int i = 0;i < n;i++)
            scanf("%lf" , &p[i]) ;
            dp[0] = 0 ;
            int lim = (1<<(n)) ;
            for(int i = 1;i < lim;i++)
            {
                  double sum = 0;
                  dp[i] = 1;
                  for(int j = 0;j < n;j++)
                  {
                      if((i&(1<<j)))
                      {
                          dp[i] += dp[i^(1<<j)]*p[j] ;
                          sum+=p[j];
                      }
                  }
                  dp[i]/=sum ;
            }
            printf("%lf " , dp[lim - 1]) ;
        }
    }





  • 相关阅读:
    C#的集合类(二)Hashtable、SortedList、Dictionary
    下载文件-JavaScript
    ASP.NET(C#)图片加文字、图片水印
    C# DataTable 互转 List<T>
    C# 将 DataTable 转 List<T>、首行转 T
    C# 金额转中文大写
    监听端口守护进程
    数据库操作的九大步骤
    日志方法
    sqlserver 查找所有子级
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6971131.html
Copyright © 2011-2022 走看看