hdu 4336 Card Collector 概率DP 状态压缩DP

做法:直接状态压缩了,如果理解了条件期望,那这道题目就可以迎刃而解

这里要求的不是期望,而是求期望/概率

#include<cstdio>
#include<cstring>
const int LMT=1<<20;
double dp[LMT+1],p[25];
int main(void)
{
    int i,n,lim,j;
    double tem;
    while(~scanf("%d",&n))
    {
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++)scanf("%lf",&p[i]);
        lim=(1<<n)-1;tem=0;
        for(i=lim-1;i>=0;i--)
        {
            tem=0.0;
            dp[i]++;
            for(j=0;j<n;j++)
                if(!(i&(1<<j)))
                {
                    dp[i]+=dp[i|(1<<j)]*p[j];
                    tem+=p[j];
                }
                dp[i]/=tem;
        }
        printf("%.4lf\n",dp[0]);
    }
    return 0;
}


 

你可能感兴趣的:(hdu 4336 Card Collector 概率DP 状态压缩DP)