SpellCards

作者:高杰

关键词:鸽巢原理 动态规划 背包

题目简述

张符卡排成一个队列,每张符卡有两个属性,等级和伤害

你可以做任意次操作,每次操作为以下二者之一:

  • 把队首的符卡移动到队尾。

  • 使用队首的符卡,对敌人造成点伤害,并丢弃队首的张符卡(包括你所使用的符卡)。如果队列不足张符卡那么你不能使用。

求出造成的伤害的总和的最大值。

数据范围

算法一

首先由于第一种操作的存在,我们把它转化成一个环上的问题,并删去第一种操作。

接下来我们证明一个结论:

为一个符卡的集合,则存在一个方案能够使用中所有符卡的充要条件为

必要性是显然的。由于使用一张符卡会使场上的符卡数减少,因此使用的符卡的之和不可能大于,否则将存在一个时刻使场上的符卡数为负。

充分性是比较显然的。我们使用归纳法证明它:

首先,若为空,则结论是显然的。

不为空,我们将中的符卡在环上标记出来,按顺时针方向的顺序编号,把他们的值记为,到下一张中的符卡的距离记为。注意到有成立,根据鸽巢原理存在一个使得,那么我们使用这张符卡不会丢弃任何内的其它符卡,从而将的规模缩小了

证明了这个结论,原题就变成了

求一个符卡的集合,满足最大。

这是一个典型的01背包问题,可以用朴素的动态规划解决。

results matching ""

    No results matching ""