题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336

题意:

  有n种卡片(n <= 20)。

  对于每一包方便面,里面有卡片i的概率为p[i],可以没有卡片。

  问你集齐n种卡片所买方便面数量的期望。

题解:

  状态压缩。

  第i位表示手上有没有卡片i。

  表示状态:

    dp[state] = expectation

    (卡片状态为state时,要集齐卡片还要买的方便面数的期望)

  找出答案:

    ans = dp[0]

    刚开始一张卡片都没有。

  如何转移:

    now: dp[state]

    对于卡片i,如果手上已经有了i,则方便面里有i等价于面里什么都没有。

    所以子期望共两种:

      (1)拿到一张还没有的卡片i。

      (2)拿到垃圾2333。

    dp[state] = sigma( dp[state|(1<<i)] * p[i] ) + dp[state] * P(useless) + 1

    P(useless)为拿到垃圾的概率。

    设tot = sigma(p[i])

    P(useless) = 1 - tot

    原式移项后:

      dp[state] = ( sigma( dp[state|(1<<i)] * p[i] ) + 1 ) / tot

  边界条件:

    dp[(1<<n)-1] = 0

    已经集齐,不用再买。

AC Code:

 // state expression:
// dp[state] = expectation
// state: state of present cards
//
// find the answer:
// ans = dp[0]
//
// transferring:
// now: dp[state]
// dp[state] = sigma( dp[state|(1<<i)] * p[i] ) + dp[state] * P(useless) + 1
// i: not been collected
// dp[state] = ( sigma( dp[state|(1<<i)] * p[i] ) + 1 ) / (1 - P(useless))
// dp[state] = ( sigma( dp[state|(1<<i)] * p[i] ) + 1 ) / tot
//
// boundary:
// dp[(1<<n)-1] = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 25
#define MAX_S ((1<<20)+5) using namespace std; int n;
double p[MAX_N];
double dp[MAX_S]; void read()
{
for(int i=;i<n;i++)
{
cin>>p[i];
}
} void solve()
{
memset(dp,,sizeof(dp));
for(int state=(<<n)-;state>=;state--)
{
double tot=;
for(int i=;i<n;i++)
{
if(!((state>>i)&))
{
dp[state]+=dp[state|(<<i)]*p[i];
tot+=p[i];
}
}
dp[state]=(dp[state]+1.0)/tot;
}
} void print()
{
printf("%.9f\n",dp[]);
} int main()
{
while(cin>>n)
{
read();
solve();
print();
}
}

HDU 4336 Card Collector:状压 + 期望dp的更多相关文章

  1. hdu 4336 Card Collector(状压dp/Min-Max反演)

    传送门 解题思路 第一种方法是状压\(dp\),设\(f(S)\)为状态\(S\)到取完的期望步数,那么\(f(S)\)可以被自己转移到,还可以被\(f(S|(1<<i))\)转移到,\( ...

  2. HDU 4336 Card Collector(动态规划-概率DP)

    Card Collector Problem Description In your childhood, do you crazy for collecting the beautiful card ...

  3. [HDU 4336] Card Collector (状态压缩概率dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...

  4. HDU 4336 Card Collector 期望dp+状压

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 Card Collector Time Limit: 2000/1000 MS (Java/O ...

  5. CF16E Fish(状压+期望dp)

    [传送门[(https://www.luogu.org/problemnew/show/CF16E) 解题思路 比较简单的状压+期望.设\(f[S]\)表示\(S\)这个状态的期望,转移时挑两条活着的 ...

  6. HDU 4336 Card Collector(状压 + 概率DP 期望)题解

    题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_ ...

  7. hdu 4336 Card Collector (概率dp+位运算 求期望)

    题目链接 Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  9. $HDU$ 4336 $Card\ Collector$ 概率$dp$/$Min-Max$容斥

    正解:期望 解题报告: 传送门! 先放下题意,,,已知有总共有$n$张卡片,每次有$p_i$的概率抽到第$i$张卡,求买所有卡的期望次数 $umm$看到期望自然而然想$dp$? 再一看,哇,$n\le ...

  10. HDU 4336——Card Collector——————【概率dp】

    Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. Java排序算法(三):直接插入排序

    [基本思想] 关键:在前面已经排好序的序列中找到合适的插入位置 步骤: 1. 从第一个元素開始,该元素能够觉得已经排好序. 2. 取出下一个元素.在已经排好序的元素序列中从后往前扫描进行比較. 3. ...

  2. 【Python】使用类和实例

    Car类 class Car(): '''模拟汽车''' def __init__(self,name,model,year): '''初始化汽车的属性''' self.name = name sel ...

  3. SAS中的自动变量

    Sas自动变量:由数据步语句自动创建的. _n_ :观测序号: _error_:错误信息变量; _numeric_ :所有数值变量: _character_:所有字符变量; _all_:所有变量; f ...

  4. 命令行运行java

    运行TestLinuxCommand.java     代码 import java.io.BufferedReader; import java.io.BufferedWriter; import ...

  5. 文件I/O之C标准库函数和系统库函数差别

    1.首先C标准库函数是工作在系统库函数之上的.C标准库函数在读写文件时候都有一个文件流指针.FILE*fp=NULL;// fp=fopen(F_PATH,"r"); fp文件流指 ...

  6. log4j email EmailDailyRollingFileAppender

    log4j发送日志邮件, 纠正非网上流传的"达到 BufferSize KB就会发送邮件", 另外重写了一个发送邮件的类DailyRollingFileAppender. 用于定期 ...

  7. 19:ReverseNumber数字颠倒

    题目描述 描述:输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001 输入描述:输入一个int整数 输出描述:将这个整 ...

  8. CocoaPods安装教程 pod setup很慢解决方案

    CocoaPods安装教程 pod setup很慢解决方案 http://www.jianshu.com/p/6230eec137f6

  9. Docker入门系列8

    commit docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser ...

  10. 图像检测之sift and surf---sift中的DOG图 surf hessian

    http://www.cnblogs.com/tornadomeet/archive/2012/08/17/2644903.html http://www.cnblogs.com/slysky/arc ...