需要算法来删除创建的重复项

时间:2012-10-26 08:22:29

标签: algorithm dynamic-programming

我有一个我需要编写的程序,我不知道该怎么做。我需要一个如何解决它的方法的参考。问题如下:
您有一个 N 整数列表。例如: [4; 2; 3; 2; 1; 5; 1; 3; 2]
如果存在 K 或更高数量的相邻重复数字,则会从列表中删除它们。您可以在任意两个数字之间添加任意数字,也可以在列表的开头/结尾添加任意数字,以便从列表中删除这些数字。

任务是使用尽可能少的数字清除列表。

1< = N < = 100 - N 是列表的长度。
2< = K < = 5 - K 是从序列中删除的重复相邻数字的最小数量。

K 在指定的范围内提供。

实施例: List = [4; 2; 3; 2; 1; 5; 1; 3; 2] - 答案是 3 ; K = 2

我的想法是拥有某种序列树,以便有效地删除数字。 此示例的树看起来像:

4 2       2
   3     3
    2 1 1
       5

所以你必须在列表的第4和第5个元素之间添加 5 (从0开始),然后第4到第7个元素消失,序列看起来像这样。

4 2   2
   3 3
    2

现在在新序列的第2和第3个元素之间添加 2 ,因此删除了第1到第5个元素。

然后将4添加到新序列中,添加到序列中的数字总数为 3 。这个问题的算法是什么?感谢。

1 个答案:

答案 0 :(得分:0)

让我们对问题进行逆向工程。考虑到你的例子,可以减少的最终字符串将如下所示

4           4
 2         2
  3       3
   2     2
    1   1
     5 5

如果你发现它是一个均匀长度的回文。所有其他可能的输入也是如此。

现在问题可以减少到在输入中找到最长的回文子序列并且将字符添加到输入字符串中,该字符对应于输入中不在回文子序列中的每个字符。找到一个最长的回文子序列是一个标准的DP问题,可以找到一个教程here

例如,在您的情况下,最长的子序列为[2,3,1,1,3,2],输入中的字符为[4,2,5],因此您必须将这些添加到输入中,或者如果您对数字感兴趣那么3就是答案。