HDU 4336 Card Collector:期望dp + 状压
2024-09-07 19:47:22
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336
题意:
一共有n种卡片。每买一袋零食,有可能赠送一张卡片,也可能没有。
每一种卡片赠送的概率为p[i],问你将n种卡片收集全,要买零食袋数的期望。
题解:
表示状态:
dp[state] = expectation
state表示哪些卡片已经有了
找出答案:
ans = dp[0]
什么都没有时的期望袋数
如何转移:
两种情况,要么得到了一张新的卡片,要么得到了一张已经有的卡片或者啥都没有。
dp[state] = ∑ (dp[state|(1<<i)]*p[i]) + dp[state]*(1 - ∑ p[i]) + 1
((state>>i)&1 == 0)
移项后:
dp[state] = ( ∑ (dp[state|(1<<i)]*p[i]) + 1 ) / ∑ p[i]
边界条件:
dp[(1<<n)-1] = 0
已经集全了。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 25
#define MAX_S ((1<<20)+50) using namespace std; int n;
double p[MAX_N];
double dp[MAX_S]; int main()
{
while(cin>>n)
{
for(int i=;i<n;i++) scanf("%lf",&p[i]);
dp[(<<n)-]=;
for(int state=(<<n)-;state>=;state--)
{
double sum=;
dp[state]=;
for(int i=;i<n;i++)
{
if(!((state>>i)&))
{
dp[state]+=dp[state|(<<i)]*p[i];
sum+=p[i];
}
}
dp[state]=(dp[state]+1.0)/sum;
}
printf("%.5f\n",dp[]);
}
}
最新文章
- cms真实问题的来源以及模拟解决方案
- Page in/Page out/Page fault
- JAVA CDI 学习(2) - Scope 生命周期
- Apache Nutch v2.3 发布,Java实现的网络爬虫
- 1.Redis安装(转)
- OSG入门即osgEarth建立一个地球的详细步骤
- 招聘一个靠谱的 iOS
- UVa 1640 (计数) The Counting Problem
- Java实战之04JavaWeb-02Request和Response
- Oracle 错误码
- javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)
- 使用Microsoft.AspNetCore.TestHost进行完整的功能测试
- 【redis 基础学习】(六)Redis HyperLogLog
- TPYBoard开发板搭建,实现隐秘通信
- django----Form提交按钮
- svn 清理失败的解决方法
- Java并发编程笔记之ThreadLocal内存泄漏探究
- 「每日一码」a&;b赋值问题
- Calculate CRC32 as in STM32 hardware (EWARM v.5.50 and later)
- VS2015使用小技巧