Hdu 4336 Card Collector (状态概率DP|容斥原理)

详细的题目大意与解析大家参考一下kuangbin的文章。

kuangbin链接

这边说一下自己对于kuangbin代码以及容斥原理位元素枚举的理解与解释,希望对大家有所帮助。

状态DP AC代码:状态压缩的思想我就不赘述了,我也只是略懂,这边仅仅分析一下状态方程

由于量比较多,我这边有的便用文字代替,有利于描述。

dp[i]表示i状态达到满状态(即收集满n个物品,以下称满状态)所需要的期望。

那么i状态当中收集了x的物品,剩余n-x个物品没有收集

那么dp[i]=p*dp[i]+p2*dp[i2]+1;

这边解释一下上面的变量:

p表示的是假如下一次抽到的物品是已经搜集过的物品被抽到的概率之和,至于为什么要这样子,有概率DP基础的应该知道吧?状态分解,事件之和。

p2表示的是抽到没有收集过物品的概率,已经加上该物品之后的状态要达到满状态的期望,这边少了一个累加,所有没有收集的累加。依然依据的是状态的分解和事件之和。

假如有问题的话,欢迎评论指教。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
double dp[1 << 22];
double p[22];
int main()
{
	int n;
	while (cin >> n)
	{
		double op = 0;
		for (int i = 0; i <n; i++)
		{
			scanf("%lf", &p[i]);
			op += p[i];
		}
		op = 1 - op;
		dp[(1 << n) - 1] = 0;
		for (int i = (1 << n) - 2; i >= 0; i--)
		{
			double x = 0, sum = 1;
			for (int j = 0; j < n;j++)
			if (i&(1 << j)) x += p[j];
			else            sum += p[j] * dp[i|(1 << j)];
			dp[i] = sum / (1 - op - x);
		}
		printf("%.5lf\n", dp[0]);
	}
}

容斥原理应用:位运算枚举

这边可能你需要百度一下容斥原理是怎么一个东西,再回来看我的解释会比较清楚,因为容斥原理我也不知道怎么讲才清楚,这边提供一个别人推荐的文章。容斥原理

好了,现在你可能已经懂了什么是容斥原理。

那么这边我以n=3为例。并且按照状态压缩来讲解。

我现在是要得到111的

那么1/p1(p1表示的是事件1发生的概率)表示的是1发生的概率,这边包括001,011,111,101

同理,1/p2包括的是010,011,111,110

1/p3:100,101,111,110

将三个相加,所得到的便是状态001,010,100,011*2,101*2,110*2,111*3这些状态对应的期望.我们需要的是111状态,所以需要想办法减去其他的

1/(p2+p1)包括,011,010,001,111,110,101

1/(p2+p3)包括110,100,010,111,101,011

1/(p3+p1)包括101,001,100,111,011,110

1/(p1+p2+p3)包括001,010,100,110,011,101,111

根据容斥原理,减去上面三个,得到:(全是负的)001,010,100,110,011,101

所以最后再加上一个1/(p1+p2+p3)即得到111状态对应的期望。

1/p对应的是期望,希望大家好好理解,我也是看了很久,有问题的欢迎跟我交流哈。QQ:417033420

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

double p[22];
int main()
{
	int n;
	while (scanf("%d", &n) == 1)
	{
		for (int i = 0; i<n; i++)scanf("%lf", &p[i]);
		double ans = 0;
		for (int i = 1; i<(1 << n); i++)
		{
			int cnt = 0;
			double sum = 0;
			for (int j = 0; j<n; j++)
			if (i&(1 << j))
			{
				sum += p[j];
				cnt++;
			}
			if (cnt & 1)ans += 1.0 / sum;
			else ans -= 1.0 / sum;
		}
		printf("%.5lf\n", ans);
	}
	return 0;
}
时间: 2024-10-27 03:30:17

Hdu 4336 Card Collector (状态概率DP|容斥原理)的相关文章

HDU 4336——Card Collector——————【概率dp】

Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3407    Accepted Submission(s): 1665Special Judge Problem Description In your childhood, do you crazy for collecting the beautiful

hdu 4336 Card Collector (概率dp+位运算 求期望)

题目链接 Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2711    Accepted Submission(s): 1277Special Judge Problem Description In your childhood, do you crazy for collecting the beaut

HDU 4336 Card Collector(概率dp+状压)

Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3014    Accepted Submission(s): 1445 Special Judge Problem Description In your childhood, do you crazy for collecting the beautifu

hdoj 4336 Card Collector 【概率dp】

题目:hdoj 4336 Card Collector 题意:集齐卡片抽大奖,每个卡片概率,及其卡片个数,然后问你及其卡片要买卡片数量的期望. 分析:最多20张卡片,用状态压缩来表示是否拿了某个卡片. 比如现在有状态10010,表示拿了第2 3 5的状态下的期望. 我们要求它,我们可以先得到11010,10110,10011,的期望,然后乘以各自位没拿的概率就是总的期望.在除去总概率就是当前的期望, 不是很懂啊///数学智商有点捉急 AC代码: #include <cstdio> #inclu

[HDU 4336] Card Collector (状态压缩概率dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡片.问你收集齐n种卡片,吃的期望零食数是多少? 状态压缩:f[mask],代表收集齐了mask,还需要吃的期望零食数. 打开包装,有3种情况,第一种:没有卡片,概率(1-sigma(p[i])) 第二种,在已知种类中:概率sigma(p[j]) 第三种,在未知种类中:p[k] 因此 f[mask]

HDU 4336 Card Collector(动态规划-概率DP)

Card Collector Problem Description In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, for example, if you collect all the 108 people in the famous novel Water Margin, you will win an amazing award. As a

HDU 4336 Card Collector(概率DP)

 题意:有n种卡片,吃零食的时候会吃到一些卡片,告诉你在一袋零食中吃到每种卡片的概率,求搜集齐每种卡片所需要买零食的袋数的期望. 思路:先状态压缩,然后概率DP 用d[i]表示由状态i到目标需要再买多少包,则状态转移方程为d[i] = p'*(d[i]+1) + sigma(d[ i | (1 << j) * p[i] ),然后相同项移到左边,最后就可以得到答案. #include<cstdio> #include<cstring> #include<cmat

hdu 4336 Card Collector

Card Collector http://acm.hdu.edu.cn/showproblem.php?pid=4336 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Special Judge Problem Description In your childhood, do you crazy for collecting the beautiful cards in

HDU 4336 Card Collector(容斥原理 or 状压求期望dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 Problem Description In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, for example, if you collect all the 108 people in the famous novel Water Margin,