输入是一系列卡片。在一个步骤中,您可以删除任何一组连续相同的卡。要删除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 []
答案 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来改进剩余的搜索树。