hdu-4336 Card Collector状态压缩|期望dp】
2016-05-27 11:07
411 查看
题意:买东西集齐全套卡片赢大奖。每个包装袋里面最多一张卡片,最少可以没有。且给了每种卡片出现的概率 p[i],以及所有的卡片种类的数量 n(1<=n<=20),问集齐卡片需要买东西的数量的期望值。需要注意的是 包装袋中可以没有卡片,也就是说:segma{ p[i] }<=1.0,i=0,2,...,n-1。
用二进制状态来表示每种物品是否出现过。例如 10101的前一个状态就有00101、10001、10100.
E(stu)表示满足stu的期望。E(stu)=∑E(pre_stu)*p'[x]+E(stu)*none.
p'[x]表示stu在第x位为1,pre_stu在第x位为0,即抓第x个卡片的概率。但是这里p[x]!=p'[x]。因为p'[x]为条件概率p'[x]=p[i]/(∑p[x]);
整理式子 :E(stu)=(∑E(pre_stu)*p[x])/(1-none-∑p[y]). x表示stu在第y位为1,pre_stu在第y位为1
--------------------------华丽分割线---------------------------
解决期望问题经常用逆推的方式。
鄙人自己理解的逆推,不足之处请各位大神指正。
例如 等差数列 A(n-1)=A(n-1)+1.假如我们从A(1)开始往后推n部,A(n)=a(1)+n-1;我们逆推公式A(n)=0,A(n-1)=A(n)+1,A(1)=A(n)+n-1.若初始化与A(n)=逆推前A(1)。那么逆推后的A(1)就是解。
如这个图。假如递推关系用图来表示是个AOE图,如我们这次的期望dp转移方程。那么我们知道起点是0开始E(0000000)为0.那么把终点置0.逆推,得到的起点值,就应该是解。
用二进制状态来表示每种物品是否出现过。例如 10101的前一个状态就有00101、10001、10100.
E(stu)表示满足stu的期望。E(stu)=∑E(pre_stu)*p'[x]+E(stu)*none.
p'[x]表示stu在第x位为1,pre_stu在第x位为0,即抓第x个卡片的概率。但是这里p[x]!=p'[x]。因为p'[x]为条件概率p'[x]=p[i]/(∑p[x]);
整理式子 :E(stu)=(∑E(pre_stu)*p[x])/(1-none-∑p[y]). x表示stu在第y位为1,pre_stu在第y位为1
--------------------------华丽分割线---------------------------
解决期望问题经常用逆推的方式。
鄙人自己理解的逆推,不足之处请各位大神指正。
例如 等差数列 A(n-1)=A(n-1)+1.假如我们从A(1)开始往后推n部,A(n)=a(1)+n-1;我们逆推公式A(n)=0,A(n-1)=A(n)+1,A(1)=A(n)+n-1.若初始化与A(n)=逆推前A(1)。那么逆推后的A(1)就是解。
如这个图。假如递推关系用图来表示是个AOE图,如我们这次的期望dp转移方程。那么我们知道起点是0开始E(0000000)为0.那么把终点置0.逆推,得到的起点值,就应该是解。
#include <stdio.h> #include <math.h> using namespace std; const double eps=1E-8; const int maxn=21; double p[maxn]; double dp[1<<maxn]; int main() { int n; while(~scanf("%d",&n)) { double none=0; for(int i=0;i<n;++i) { scanf("%lf",p+i); none+=p[i]; } none=1-none; dp[(1<<n)-1]=0; for(int i=(1<<n)-2;i>=0;--i) {//枚举状态 double ept=0,res=1; for(int j=0;j<n;++j) {//消除第j位的状态 if(i&(1<<j)) ept+=p[j];//第j种卡片已存在 else res+=p[j]*dp[i|(1<<j)]; } dp[i]=res/(1-none-ept); } printf("%.5f\n",dp[0]); } return 0; }
相关文章推荐
- CF335E Counting Skyscrapers
- 【BZOJ3450】Easy
- 【BZOJ4318】OSU!
- BZOJ 4318 OSU! 期望DP
- ZOJ 3640 Help Me Escape (期望dp)
- LightOJ 1038 - Race to 1 Again (期望dp)
- Codeforces Round #333 E. Kleofáš and the n-thlon (期望dp)
- 【期望dp】poj 2096 Collecting Bugs
- 【期望dp】Lightoj 1027 A Dangerous Maze
- 【期望dp】LightOJ 1030 Discovering Gold
- 【BZOJ3450】Tyvj1952 Easy【期望DP】
- 【BZOJ1426】收集邮票【期望DP】
- hdu 4649 (期望dp)
- Jzoj5244 Daydreamin
- Jzoj4890 随机游走
- Jzoj5444【NOIP2017提高A组冲刺11.2】救赎
- 51Nod-1705-七星剑
- 【NOI2005】bzoj1415 聪聪和可可
- 【SCOI2008】bzoj1076奖励关
- 51nod 1450 闯关游戏