APP下载

贪吃的九头龙问题

2019-10-21王伟业路宇李晓寒

青年生活 2019年14期
关键词:树形大头果子

王伟业 路宇 李晓寒

摘要:贪吃的九头蛇是树形动态规划的经典问题,是基于树结构的动态规划问题。

关键词:树形 动态规划

一、问题描述

传说中的九头龙是一种特别贪吃的动物。虽然名字叫“九头龙”,但这只是说它出生的時候有九个头,而在成长的过程中,它有时会长出很多的新头,也会有旧头因衰老而自己脱落。 有一天,有 M(M≥3) 个脑袋的九头龙看到一棵长有 N 个果子的果树,喜出望外,恨不得一口把它全部吃掉。 可是必须照顾到每个头,因此它需要把 N 个果子分成 M 组,每组至少有一个果子,让每个头吃一组。 这 M 个脑袋中有一个最大,称为“大头”,是众头之首,它要吃掉恰好 K 个果子,而且 K 个果子中理所当然地应该包括唯一的一个最大的果子。 果子由 N-1 根树枝连接起来,由于果树是一个整体,因此可以从任意一个果子出发沿着树枝“走到”任何一个其他的果子。对于每段树枝,如果它所连接的两个果子需要由不同的头来吃掉,那么两个头会共同把树枝弄断而把果子分开;如果这两个果子是由同一个头来吃掉,那么这个头会懒得把它弄断而直接把果子连同树枝一起吃掉。当然,吃树枝并不是很舒服的,因此每段树枝都有一个吃下去的“难受值”,而九头龙的难受值就是所有头吃掉的树枝的“难受值”之和。九头龙希望它的“难受值”尽量小,你能帮它算算吗?

二、例题求解

例:果树包含 8 个果子,7 段树枝,各段树枝的“难受值”标记在了树枝的旁边。九头龙有三个脑袋,大头需要吃掉 6 个果子,其中必须包含最大的果子。

即 N=8  ,M=3 ,K=6。

首先,判断问题是否有解。判断是否有解是十分简单的。我们只需要看在给每个小头分配1个,大头分配K个的情况下,所需要的果子的数量是否大于了果子的总数,即若M+K-1>N,则无解,此题M+K-1=8=N,故有解。

接下来就是有解的情况了。

首先我们需要知道,再分配好大头之后,剩下的果子必然存在一种分配方式,使得九头龙的难受值不会再增加。考虑树的结构,每一条线都连接相邻两层的果子,故只需由第一层到最后一层让小头依次吃,如果层数多于小头数量,则循环进行。

解决了这个问题之后,我们就只需要考虑大头了。对于每一个果子来说,它要么是被大头吃,要么是不被。于是,我们便可以用树形DP来解决。

设DP[u][sum][0]表示u结点,它以及它的儿子中,大头吃了sum个果子,并且当前这个没有被大头吃。

那么DP[u][sum][1]就是表示u结点,它以及它的儿子中,大头吃了sum个果子,并且当前这个被大头吃了。

可得递推关系式:

DP[u][sum][0]=min{sigma{min(DP[v][j][0],DP[v][j][1])}} sigma{j}=sum;

DP[u][sum][1]=min{sigma{min(DP[v][j][0],DP[v][j][1]+len)}} sigma{j}=sum-1;

DP[u][1][1]=DP[u][0][0]=0;

问题归结于求解DP[1][K][1]

DP[8][0][0]=0     DP[8][1][1]=0     DP[7][0][0]=0     DP[7][1][1]=0

DP[6][0][0]=0     DP[6][1][1]=0     DP[5][0][0]=0     DP[5][1][1]=0

DP[4][0][0]=0     DP[4][1][0]=0     DP[4][2][0]=0     DP[4][1][1]=0

DP[4][2][1]=5     DP[4][3][1]=20    DP[3][0][0]=0     DP[3][1][1]=0

DP[2][0][0]=0     DP[2][1][1]=1     DP[2][2][0]=0     DP[2][2][1]=10

DP[2][1][0]=0     DP[2][3][1]=22

最终目标:

DP[1][6][1]=min{55,42,13,24, 37}=13(分别对应3 1 1;3 0 2;2 1 2;2 0 3;1 1 3)

即取2 1 2,大头吃1 3 5 6 7 8,得解。

三、小结

贪吃的九头龙问题是典型的树形动态规划问题,在树结构上进行动态规划,求解时关键是找出递推关系,逐步计算,最终即可得到答案。

猜你喜欢

树形大头果子
树形灯
云南葡萄架式和树形应用调查分析
浅探日本松柏类盆景的制作
果子的滋味私厨
果子和她的+1
一颗滋味果子
疏花疏果和整形修剪对桃果实大小的影响研究进展