• 信息学竞赛中一类决策问题的通解


    这里所谓一类决策问题,是指给你一个数的区间,然后你需要找到最小的满足条件的数或者最大的不满足条件的数,一般保证可二分性,即如果$x$满足条件,则所有$ge x$的数都满足条件;如果$x$不满足条件,则所有$le x$的数都不满足条件。

    最简单的就是二分查找了。比如现在有6个数:1,3,6,10,15,21,再给一个$x(xle 21)$,然后要询问$ge x$的最小的数,这个直接二分就可以了。那么我们用所谓决策树的东西来考虑一下,就是这样子的:

    上面这棵树就是所谓的决策树,每个非叶子节点表示一种决策,每一个叶子节点表示决策的结果,然后每一个叶子节点的深度就代表着需要决策的次数。

    ------------------------------------分割线------------------------------------

    我们来做一个题吧:http://acm.hdu.edu.cn/showproblem.php?pid=5781

    这个题可以用Dp做出来,就不多说了其实我是不会啊,那么我们现在用决策树的角度来考虑考虑吧。

    同样也是一棵二叉树,对于一个非叶子节点的决策$x$,我们同样令左儿子为$le x$,右儿子为$>x$,那么我们也可以构造出一棵赛艇和上图差不多的决策树。只不过有一个限制,就是对于一条从根开始的链,走右儿子的边的次数不能超过$w$,也仅此而已。

    然后题目要求决策次数期望最小值,即所有叶子节点的深度的平均值最小,所以我们可以考虑从根节点开始bfs,每次拓展两个儿子出来,直到拓展出了$k+1$个叶子节点为止,唯一的限制就是走了$w$次右儿子的点不能拓展,这样可以保证所有儿子的总深度最小。拓展完之后就把所有叶子节点的深度加起来除以$k+1$就是答案了。

    ------------------------------------分割线------------------------------------

    我们再来做一个题吧:有$n$瓶药,其中有且仅有一瓶有毒,你需要找出这瓶有毒的药。每次你可以选择一些药并吃下去,过了$L$秒后,如果那瓶有毒的药被吃了,那么你将产生相应的症状并需要休息$d$秒才能继续试药,否则你可以直接继续试药。问你在$T$秒的时间内是否一定能在这$n$瓶药中找到这瓶毒药,且在第T秒时不能有中毒症状。

    同样我们考虑决策树,设左儿子为没有中毒,右儿子有中毒。那么一个节点的深度(这里的边有边权)为:$A imes L + B imes (L+d)$,其中$A$和$B$分别为走左儿子的次数和走右儿子的次数。那么一个点$u$是叶子节点当且仅当$T - L - d < dep_u le T$,如果一个点的深度$le T - L - d$,那么这个点还是可以继续拓展的,不会是叶子节点,然后一个点的深度显然是要$le T$的。这里就解释了叶子节点的深度限制。于是接下来我们只需要算出来叶子节点的个数然后和$n$做个比较就可以了。

    怎么求叶子节点个数呢?我们可以考虑枚举$B$,然后$A$的取值范围便可以根据上面说的不等式算出来。然后对于每一组$A$和$B$,叶子节点的个数为$inom{A+B}{A}$,这就相当于是要向下走$A+B$次,要选$A$次走左儿子的方案数。然后对于一个固定的$B$,$A$的取值范围肯定是一个区间$[l,r]$,那么叶子节点的个数就是$sum_{i=l}^{r}inom{B+i}{B}=inom{B+r+1}{B+1}-inom{B+l}{B+1}$。所以我们就可以通过枚举$B$来算出叶子节点的总数了。

     ------------------------------------分割线------------------------------------

    总之决策树大概就是这么个东西,当然我这个也只是略懂皮毛,欢迎大家提出批评指正。

  • 相关阅读:
    【JBPM4】创建流程实例
    【JBPM4】流程部署
    Table上下滚动
    oracle 导入dmp文件
    Win7下安装Oracle 10g
    【Hibernate3.3复习知识点二】
    通过IP地址和子网掩码计算主机数
    vue.js知识总结
    vue生产环境部署总结
    移动端上遇到的各种坑与相对解决方案
  • 原文地址:https://www.cnblogs.com/gromah/p/5775568.html
Copyright © 2020-2023  润新知