HDU4336 Card Collector 概率DP求期望+状压

题目大意:要集齐N张卡片,每包干脆面出现每种卡片的概率已知,问你集齐N张卡片所需要的方便面包数的数学期望(N<=20)。

solution:

由于N<=20,我们可以考虑状压,设dp[S]表示牌的状态为S时的需要的方便面包数的数学期望。

那么,对于每一个状态,考虑枚举每一张牌i(摸到了i),此时:

① 如果S中不含i,dp[S]+=(dp[S|(1<<i-1)]+1)*p[i]。

② 如果S中已经包含i,那么算到下面的情况中去。

但是注意到,上述情况是已经保证了摸到牌,但是其实可以没有摸到牌,结合②则dp[S]=(dp[S]+1)*P,其中P为摸不到任意一张牌或摸到一张已有的牌的概率,可以发现\(P+\sum{①中的p_i}=1\)

综上,得到\(dp[S]=(dp[S]+1) *P+\sum{_{!(S\&(1<<i-1))}(dp[S|(1<<i-1)]+1) *p[i]}?\)。

把式子整理一下,得到: \(dp[s]=\frac{1+\sum{_{!(S\&(1<<i-1)}}dp[S|(1<<i-1)*p[i]]}{1-P}\)。

Code:

#include<cmath>
#include<string>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define RG register
#define IL inline
#define LL long long
#define DB double
using namespace std;

const int N=1<<21;

DB p0,p[21],dp[N];

int main()
{
    RG int n,i,j,all;
    while(scanf("%d",&n)!=EOF) {
        all=(1<<n)-1;
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;++i) scanf("%lf",&p[i]);
        for(i=all-1;i>=0;--i) {
            for(j=1,p0=0;j<=n;++j)
                if(!(i&(1<<j-1))) dp[i]+=dp[i|(1<<j-1)]*p[j],p0+=p[j];
            dp[i]=(dp[i]+1)/p0;
        }
        printf("%.4lf\n",dp[0]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Bhllx/p/10847660.html

时间: 2024-10-09 10:05:49

HDU4336 Card Collector 概率DP求期望+状压的相关文章

HDU4336-Card Collector(概率DP求期望)

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

HDU 4405 Aeroplane chess (概率DP求期望)

题意:有一个n个点的飞行棋,问从0点掷骰子(1~6)走到n点需要步数的期望 其中有m个跳跃a,b表示走到a点可以直接跳到b点. dp[ i ]表示从i点走到n点的期望,在正常情况下i点可以到走到i+1,i+2,i+3,i+4,i+5,i+6 点且每个点的概率都为1/6 所以dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])/6  + 1(步数加一). 而对于有跳跃的点直接为dp[a]=dp[b]; #include<stdio.h>

HDU3853-LOOPS(概率DP求期望)

LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Submission(s): 1864    Accepted Submission(s): 732 Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wants to help h

HDU4405-Aeroplane chess(概率DP求期望)

Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1182    Accepted Submission(s): 802 Problem Description Hzz loves aeroplane chess very much. The chess map contains N+1 grids lab

HDU 4050 wolf5x (概率DP 求期望)

题意:有N个格子,1~N,起点在0,每个格子有一个状态(0,1,2,3),每次可以跨[a,b]步, 问走完N个格子需要步数的期望,每次尽量走小的步数,即尽量走a步,不能则走a+1,-- 状态0意味着你不能踏进对应的网格. 状态1意味着你可以??步入网格用你的左腿. 状态2意味着你可以??步入网格用你的右腿. 状态3意味着你可以进入网格用任何你的腿,而接下来的步骤中,您可以使用任何的腿;即你不需要遵循上述规则. 思路:借鉴了各路大神的思想理解了下. dp[i][j] :表示走到第 i 个格子在 j

POJ 2096 Collecting Bugs(概率DP求期望)

传送门 Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 4333 Accepted: 2151 Case Time Limit: 2000MS Special Judge Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu

Codeforces 235B Let&#39;s Play Osu! (概率dp求期望+公式变形)

B. Let's Play Osu! time limit per test:2 seconds memory limit per test:256 megabytes You're playing a game called Osu! Here's a simplified version of it. There are n clicks in a game. For each click there are two outcomes: correct or bad. Let us deno

POJ 2096:Collecting Bugs 概率DP求期望

Collecting Bugs 题目连接: http://poj.org/problem?id=2096 题意: Ivan喜欢收集bug,他每天都会找到一个bug,找到的这个bug有一种属性并且属于一个子系统,bug共有n种属性,子系统共有s个 (0<n, s≤1000),求Ivan集齐了n种bug且每个子系统都有bug的期望. 题解: 第一道求期望的题,令dp[i][j]表示系统已经有了i个系统的全部j种bug并且要得到所有bug的天数的期望,因此dp[n][s]=0,而dp[0][0]则是所

HDU 3853 LOOPS(概率dp求期望啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wants to help her friend Madoka save the world. But because of the plot of the Boss Incubator, she is trapped in