hdu 4336 Card Collector (容斥 or dp)
2016-04-04 09:47
330 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4336
大致题意:我们需要收集n张卡片,在每一个袋子里出现卡片对应的概率是pi, 现在求出收集完所有卡片需要袋子数目的期望。
分析:最开始自己用容斥做的,从简单的情况入手,
保证收集到卡片1——p1 对应次数:1p1
保证收集到卡片2——p2 对应次数:1p2
保证收集到卡片1或者卡片2——p1+p2 对应次数:1p1+p2
把这两张卡片统统收集到——交集部分的概率,对应次数:1p1+1p2−1p1+p2
奇加偶减,容斥。
code:
但是不会概率dp毕竟是不足,以学习的心态开始了第二种做法:
期望=∑piwi (概率*权重的和)
收集到x张卡片的期望:E(x)=∑p(xd)[1+E(y)]+[1−∑p(xd)](1+E(x))
即在y状态下能收集到+不能收集到
经过化简:E(x)=∑p(xd)E(y)+1∑p(xd)
解释xd: 表示第d个元素被收集到,以二进制看待整个过程,求期望一般是从高位推到低位,即从11⋯1 推到00⋯0 出现0的地方就出现交集,
code:
大致题意:我们需要收集n张卡片,在每一个袋子里出现卡片对应的概率是pi, 现在求出收集完所有卡片需要袋子数目的期望。
分析:最开始自己用容斥做的,从简单的情况入手,
保证收集到卡片1——p1 对应次数:1p1
保证收集到卡片2——p2 对应次数:1p2
保证收集到卡片1或者卡片2——p1+p2 对应次数:1p1+p2
把这两张卡片统统收集到——交集部分的概率,对应次数:1p1+1p2−1p1+p2
奇加偶减,容斥。
code:
#include <iostream> #include <cstdio> using namespace std; double f[25]; int main() { int n; while(cin>>n){ for(int i=0;i<n;i++) scanf("%lf",&f[i]); double ans=0,s=0; int g; for(int i=1;i<(1<<n);i++){ g=0; s=0; for(int j=0;j<n;j++) { if(i&(1<<j)) { g++; s=s+f[j]; } } if(g&1) ans=ans+1/s; else ans=ans-1/s; } printf("%.5lf\n",ans); } return 0; }
但是不会概率dp毕竟是不足,以学习的心态开始了第二种做法:
期望=∑piwi (概率*权重的和)
收集到x张卡片的期望:E(x)=∑p(xd)[1+E(y)]+[1−∑p(xd)](1+E(x))
即在y状态下能收集到+不能收集到
经过化简:E(x)=∑p(xd)E(y)+1∑p(xd)
解释xd: 表示第d个元素被收集到,以二进制看待整个过程,求期望一般是从高位推到低位,即从11⋯1 推到00⋯0 出现0的地方就出现交集,
code:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; double dp[(1<<20)+10],p[25]; int main() { int n; while(cin>>n){ for(int i=0;i<n;i++) scanf("%lf",&p[i]); memset(dp,0,sizeof(dp)); for(int i=(1<<n)-2;i>=0;i--){ // start at (1<<n)-2 dp[(1<<n)-2] is answer for (1<<n)-1 double t=0; for(int j=0;j<n;j++){ if(i&(1<<j)) continue; // i digit must be 0 dp[i]=dp[i]+p[j]*dp[i|(1<<j)]; // for y: j digit change to 0 t=t+p[j]; } dp[i]=(dp[i]+1)/t; } printf("%.5lf\n",dp[0]); } return 0; }
相关文章推荐
- iPhone/iPad UI尺寸规范
- RGBD物体识别(5)--ubuntu同时使用OpenCV2.4.X和3.X终极解决办法
- Reveal 的简单使用
- 分数规划
- OC中Category的注意点
- OC高效率52之熟悉系统框架
- 理解js中的this对象
- 711 无法加载远程访问连接管理服务 Remote Access connection Manager 126 找不到指定的模块
- 求俩数的平均值(不用公式)
- Dalvik指令集
- SSMS报1222错误
- 我与Django
- Free Pascal保留字
- Java面向对象
- Contiki移植到STM32F103VC
- VS中智能提示无法显示中文
- JS中的prototype
- Android中添加监听回调接口的方法
- 二进制位模式从左到右翻转后的值
- vc 中各种类型的数据相互转换