蓝桥杯 算法提高-金属采集

金属采矿

人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了。一些节点之间有道路相连,所有的节点和道路形成了一棵树。一共有 n 个节点,这些节点被编号为 1~n 。人类将 k 个机器人送上了火星,目的是采集这些金属。这些机器人都被送到了一个指定的着落点, S 号节点。每个机器人在着落之后,必须沿着道路行走。当机器人到达一个节点时,它会采集这个节点蕴藏的所有金属矿。当机器人完成自己的任务之后,可以从任意一个节点返回地球。当然,回到地球的机器人就无法再到火星去了。我们已经提前测量出了每条道路的信息,包括它的两个端点 x 和 y,以及通过这条道路需要花费的能量 w 。我们想花费尽量少的能量采集所有节点的金属,这个任务就交给你了。

解题思路

整个树中任意边都是双向的,所以虽然题目给定的是S点为初始点,仍可以把S点看成树的root,有了这个事实,题目就是转化为一个典型的树状dp。
首先要思考一个问题,如何定义状态和状态转移方程。
按照题意,对于任一顶点,设在该点有k个机器人,求出遍历它的全部子节点花费的最小代价。那么对于一个子树,我们可以给它[1,k]个机器人让他们遍历子树,然后让他们停在某些位置,当然也可以让这些机器人遍历完返回。
这里考虑一个问题,对一棵子树使用x个机器人进行遍历(x>1),且x个机器人全部返回,最小代价一定比用1个机器人进行遍历整个子树且返回大。同样,如果对一棵子树部分机器人返回,部分不返回,则这种情况一定没有仅仅只用不返回的部分遍历整棵子树且不返回小。所以这两种情况都不需要考虑,后面引入分组背包之后会再讨论。其实这也恰恰说明了动态规划必须对每一种状态的转移进行全面的考虑,不能漏掉任何一种决策,但对于某一些一定不会选择的决策,动态规划就无需考虑这些决策。学习动态规划这些天,我最大的感受就是枚举回朔是一个盲打莽撞的小孩子,而动态规划则是一个精于算计的大人,每一步都是有目的的状态转移。我理解的还是太浅了,希望通过不断的做题学习能够对动态规划有更深入的理解。

好了,问题已经变成对于一个根节点给定k个机器人,把这些机器人全部或部分分配给子节点,遍历全部节点所需要的最小代价。
这里意图已经很明显了,对于根节点的每一个子树都可以使用[1,k]个机器人,而根节点就是通过选择一种分配策略,使得代价最小。不难想到这就是一个分组背包问题。
所谓分组背包,就是有n组物品,每一个物品都有自己的重量和价值,从每一个背包里选择至多一个物品,使得背包在不超过最大重量限制的时候价值最大。而在这道题里,每一个子树就是一个分组,[1,k]个机器人就是物品的重量,给子树x个机器人所耗费的最小代价就是他们的价值。所不同的是:1.对于每一个子树,按照上面的讨论还需要考虑派给一个机器人是的最小代价。2.每一个子树一定需要被遍历,所以每一个分组一定需要被遍历,这很简单,只要在代码里加上一点特殊处理即可。
有了分组背包的思想,再去考虑上文说到的n个机器人全部返回(这里的返回不是题意里的返回地球,而是返回到当前遍历的根节点)的问题,这其实就相当于这个分组里的一个重量为0(因为若选择了这个方案,机器人并没有损耗),耗费的能量却比用一个机器人遍历整个子树来的多。那么在决策的时候,他一定不会被选(很简单,因为他和1个机器人遍历用的能量还多,但其他分组选择的方案用的能量却一样,相比之下一定不会选择它)。举一反三,可以知道n个机器人返回a个,n-a个不返回的问题相当于重量为n-a个的物品,它对其他分组的决策产生的影响和用n-a个机器人遍历且不返回是一样的,但耗费的能量更大。
这样考虑的话,我们其实不需要考虑这些机器人返回的可能了,而仅仅保留一个机器人遍历且返回的情况。

下面给出状态和状态转移方程,需要注意的是,由于这个问题的最优解是子节点所有机器人数目下的最优解的组合,状态定义不仅要考虑该节点给定k个机器人时的最小能量,还需要引入一个附加分量,这个附加分量是为了通过分组背包的思想求得最后的最优解而设立的,用来标记给前n个子节点分配机器人时能获得的最小能量。而在程序里省略了这一分量,这是可行的,这是常用的一种技巧,滚动数组。
定义如下

d(r,n,k)

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值