zoukankan      html  css  js  c++  java
  • 概率DP 礼物

    2019.7.16

      hzoi noip模拟T1

        发现自己就是个**,一看到概率DP就犯难。硬着头皮打暴力,连精度也不会卡,尽管知道概率DP都倒着推,emmm。。。

      首先,要明确题面,是有P[i]的几率买到此礼物,而一次只买到一件。然后,显然,P[i]>0,所以最大喜悦值为sum

      10%

        print 1/P[1]

      100%

        n<=20 考虑状压,dp[state]表示从dp[(1<<N)-1]到此的期望,初始状态为dp[(1<<N)-1]=0 。

       有转移式

        dp[state]=Σ{(dp[state]+1)*P[s+1]}(买到已买到的)+(dp[state]+1)*(1-ΣP[i])(啥都没买到)+Σ{(dp[state^(1<<s)]+1)*P[s+1]}

       然后移项即可

      

    #include<cstdio>
    #include<iostream>
    #define MAXN 25
    using namespace std;
    int W[MAXN];
    double P[MAXN];
    int N;
    double mei=1.0;
    double dp[(1<<20)+1];
    long long sum;
    int main(){
    //    freopen("da.in","r",stdin);
        scanf("%d",&N);
        for(int i=1;i<=N;++i){
            scanf("%lf%d",&P[i],&W[i]);
            mei-=P[i];    
            sum+=W[i];
        }
        int lim=(1<<N)-1;
        dp[0]=0;
        double lin,xi;
        for(int state=lim-1;state>=0;--state){
    //        printf("orz state=%d
    ",state);
            xi=1.0;
            for(int s=0;s<N;++s)
                if(!((1<<s)&state))
                    dp[state]+=(dp[state^(1<<s)]+1)*P[s+1];
                else{
                    xi-=P[s+1];
                    dp[state]+=P[s+1];    
                }
            dp[state]+=mei;
            dp[state]/=(xi-=mei);
    //        printf("xi=%lf
    dp[%d]=%lf
    ",xi,state,dp[state]);
        }
        printf("%lld
    %.3lf
    ",sum,dp[0]);
    }
    View Code

      别忘了W[i]<=10^9

      开long long

  • 相关阅读:
    最值得你学习的编程语言
    【收藏】程序员的资料库--技术文档、视频教程、电子书
    pig 安装
    MySQL导入.sql文件及常用命令
    win7下使用 EasyBCD 硬盘安装centOS
    Linux系统分区
    Hadoop实战教程视频
    中医药小分子和表观遗传重编程
    OpenSSL
    iOS 判断网络连接状态之重写Reachability
  • 原文地址:https://www.cnblogs.com/2018hzoicyf/p/11195440.html
Copyright © 2011-2022 走看看