• 【学习笔记】Min-max 容斥


    经常和概率期望题相结合。

    对于全序集合 (S),有:

    [max S=sumlimits_{Tsubseteq S,T ot=varnothing}(-1)^{vert Tvert -1}min T ]

    [min S=sumlimits_{Tsubseteq S,T ot=varnothing}(-1)^{vert Tvert -1}max T ]

    证明

    对于 (xin S),假设 (x)(S) 中第 (k) 大的元素,则建立映射(f:x ightarrow {1,2,dots,k})

    可以得到对于 (x,yin S),有:

    [f(min (x,y))=f(x)cap f(y) ]

    [f(max (x,y))=f(x)cup f(y) ]

    因此得到:

    [egin{aligned} vert f(max S)vert&=iggvert igcuplimits_{xin S}f(x)iggvert \ &=sumlimits_{Tsubseteq S}(-1)^{vert Tvert -1}iggvert igcaplimits_{xin T}f(x)iggvert\ &=sumlimits_{Tsubseteq S}(-1)^{vert Tvert -1} vert f(min T)vert\ end{aligned}]

    (vert f(max S)vert) 映射回原式,从而得证。

    通俗的说,就是对于除本身集合的其他的集合取最小值时,集合大小为奇数时加上,大小为偶数时减掉,而选奇数个和选偶数个的方案数又是一样的,于是抵消掉了,最后只剩下 (f(maxlimits_{xin S} x))的贡献。

    拓展

    [max_k S=sumlimits_{Tsubseteq S,vert Tvertgeq k}(-1)^{vert Tvert -k}{vert Tvert-1choose k-1}min T ]

    背他就完了

    应用

    常见的应用:有 (n) 个变量,每个变量出现的概率为 (p)。问每一个变量都出现的期望时间。

    根据期望的线性性质,可以得到

    [E(max S)=sumlimits_{Tsubseteq S,T ot=varnothing}(-1)^{vert Tvert -1}E(min T) ]

    其中 (E(min T)) 显然就是 (cfrac{1}{sumlimits_{iin T}p_i})

    例题:礼物

    夏川的生日就要到了。作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物。

    商店里一共有种礼物。夏川每得到一种礼物,就会获得相应喜悦值 $ W_i$(每种礼物的喜悦值不能重复获得)。

    每次,店员会按照一定的概率 (P_i)(或者不拿出礼物),将第i种礼物拿出来。 季堂每次都会将店员拿出来的礼物买下来。没有拿出来视为什么都没有买到,也 算一次购买。

    众所周知,白毛切开都是黑的。所以季堂希望最后夏川的喜悦值尽可能地高。

    求夏川最后最大的喜悦值是多少,并求出使夏川得到这个喜悦值,季堂的期望购买次数。

    显然的 Min-max 容斥模板题。最大的喜悦值就是给出的喜悦值的和,而剩下就是套式子了。用 dfs 枚举子集 (T),时间效率 (O(2^n)) ,空间效率 (O(n))

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=30;
    int n;
    long long ans;
    double res;
    double p[maxn];
    
    void dfs(int now,double sum,int opt){
        if(now==n+1){
            if(sum>1e-9)res+=1.0*opt/sum;
            return;
        }
        dfs(now+1,sum+p[now],-opt);
        dfs(now+1,sum,opt);
    }
    
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            long long u;
            scanf("%lf%lld",&p[i],&u);
            ans+=u;
        }
        printf("%lld
    ",ans);
        dfs(1,0,-1);
        printf("%.3lf
    ",res);
        return 0;
    }
    
  • 相关阅读:
    Linux 下安装 numpy 和 scipy
    排序算法总结
    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
    Java读取Excel并解析文本(并格式化输出)
    快捷键记忆
    初级应该学习的
    深入理解加密、解密、数字签名和数字证书
    数据签名和验签
    POI结构与常用类
    exlipse继承反编译插件
  • 原文地址:https://www.cnblogs.com/Midoria7/p/13689631.html
Copyright © 2020-2023  润新知