找出每场比赛的最大得分数

时间:2017-11-14 13:50:29

标签: algorithm

输入是一系列卡片。在一个步骤中,您可以删除任何一组连续相同的卡。要删除k张卡,您会获得k * k分。找出每场比赛可获得的最大分数。

时间限制:O(n 4

示例:
输入: [1,8,7,7,7,8,4,8,1]
输出: 23

有谁知道如何解决这个问题?

为了澄清,在给定的示例中,最佳解决方案的一条路径是

Remove   Points   Total   new hand
 3 7s      9        9     [1, 8, 8, 4, 8, 1]
 1 4       1       10     [1, 8, 8, 8, 1]
 3 8s      9       19     [1, 1]
 2 1s      4       23     []

1 个答案:

答案 0 :(得分:1)

<强>方法

递归适合这里。

首先,确定数组中的连续序列 - 这个问题的一个问题是,如果您决定删除至少一个7,则需要删除整个三个序列。从这里开始,您将使用卡片和数量。例如,

card  = [1, 8, 7, 8, 4, 8, 1]
quant = [1, 1, 3, 1, 1, 1, 1]

现在你已经为实际的解决做好了准备。遍历数组。对于每个元素,删除该元素,并添加该移动的分数。 检查两侧的元素是否匹配;如果是,请合并这些条目。重新考虑剩下的数组。

例如,这是第一次被证明是给定输入的最佳解决方案:

选择并删除三个7的

card  = [1, 8, 8, 4, 8, 1]
quant = [1, 1, 1, 1, 1, 1]
score = score + 3*3

合并相邻的8条目:

card  = [1, 8, 4, 8, 1]
quant = [1, 2, 1, 1, 1]

重新开始这个游戏。

<强>改进

使用动态编程:为每个子游戏记住解决方案。

卡片阵列中只出现一次的任何卡片都可以先移除,不会失去一般性。在给定的示例中,您可以删除7和单个4来改进剩余的搜索树。