HDU 4336 Card Collector (状压+概率DP)
2015-07-12 23:16
471 查看
题意很短略去不说。
思路:设dp[S] 为已集齐状态S中的各卡片后集齐所有卡片的期望值。
那么方程为dp[S] = 1 + sigma(dp[S + {v}] *p[v]) + (1 - sigma(p[v]))*dp[S] (v是S中不包含的状态)
代码:
思路:设dp[S] 为已集齐状态S中的各卡片后集齐所有卡片的期望值。
那么方程为dp[S] = 1 + sigma(dp[S + {v}] *p[v]) + (1 - sigma(p[v]))*dp[S] (v是S中不包含的状态)
代码:
#include<cstdio> #include<iostream> using namespace std; const int MAX = 2000000; const int maxn = 55; double dp[MAX]; int n; double p[maxn]; void solve(){ int Ed = 1 << n; dp[Ed-1] = 0; double t1,t2; for(int S = Ed - 2; S >= 0 ; S--){ t1 = 1 ; t2 = 0; for(int i = 0 ; i < n ; i++){ if(!(S >> i & 1)){ t2 += p[i]*dp[S | 1 << i]; t1 -= p[i]; } //cout<<t1<<" "<<t2<<endl; } dp[S] = (1 + t2) / (1 - t1); //cout<<S<<" "<<dp[S]<<endl; } printf("%.6f\n",dp[0]); } int main(){ while(~scanf("%d",&n)){ for(int i=0;i<n;i++) scanf("%lf",&p[i]); solve(); } return 0; }
相关文章推荐
- 怎样在工作中积累自己的资源!?
- 2015071203 - 尽可能日清日结
- 【操作系统】调度算法
- 精益创业方法论
- ZOJ 3822 Domination
- 【vim】vim常用命令
- 小码哥学习感想第一天
- 某辉回来授心得
- 永远需要迈出第一步——48 GameJam赛后有感
- 2015071202 - 大圣归来
- Windows 7 在资源管理器中显示软件快捷方式
- iOS证书说明和发布内购流程整理
- 从链表操作理解C++传指针的问题
- 打开FlashBuilder秒退
- 七彩导航栏的制作(二)
- Linux 4.0+内核对硬件交换模块的支持(HW Switch Offload)
- OpenCV学习-搭建环境
- The AnimationClip 'Walk' used by the Animation component 'Pig' must be marked as Legacy.
- linux程序设计——把管道用作标准输入和输出(第十三章)
- 汽车租赁系统总结