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

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

最简单的就是二分查找了。比如现在有6个数:1,3,6,10,15,21,再给一个$x(x\le 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\times L + B\times (L+d)$,其中$A$和$B$分别为走左儿子的次数和走右儿子的次数。那么一个点$u$是叶子节点当且仅当$T - L - d < dep_u \le T$,如果一个点的深度$\le T - L - d$,那么这个点还是可以继续拓展的,不会是叶子节点,然后一个点的深度显然是要$\le T$的。这里就解释了叶子节点的深度限制。于是接下来我们只需要算出来叶子节点的个数然后和$n$做个比较就可以了。

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

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

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

posted @ 2016-08-16 13:35  Gromah  阅读(636)  评论(1编辑  收藏  举报