您的位置:首页 > 其它

HDU 4336 Card Collector

2018-04-28 15:05 148 查看

链接

题意

  给n张卡片,每张卡片都有出现的概率,求收集到全部的卡片的期望次数。

思路

  状压dp。dp[i] 表示收集了i张,的期望次数。dp
=0;可能自己转移到自己,解一下方程。

  记zz的bug:1、1<<20在计算器中算完了之后是1048576,然后就少看了一位,开了110000,然后就一直 Runtime Error (ACCESS_VIOLATION)。2、千万不要看到样例是3位,然后就输出了3位。。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>

using namespace std;

const int N = (1<<21)+10;

double p[30],dp
;

int main() {
int n;
while (~scanf("%d",&n)) {
for (int i=1; i<=n; ++i) scanf("%lf",&p[i]);
int t = (1 << n) - 1;
dp[t] = 0;
for (int s=t-1; s>=0; --s) {
double tmp = 0,p0 = 0;
for (int i=1; i<=n; ++i) {
if (s & (1<<(i-1))) continue;
tmp += dp[s | (1<<(i-1))] * p[i];
p0 += p[i];
}
dp[s] = (tmp+1.0)/p0;
}
printf("%lf\n",dp[0]);
}
return 0;
}

 

  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: