给出索引约束的最大和子阵列

时间:2015-08-28 00:59:22

标签: python algorithm dynamic-programming

如果某些数组索引无法配对,我如何找到唯一正整数数组的最大总和?

例如,我们有这个数组:[8,2,1,3,9,4]

索引(0,4)和(4,5)处的元素彼此不相似。

在这种情况下,最大总和将是:8 + 2 + 1 + 3 + 4 = 18

假设这是100个条目的规模和最多一半的约束,你将如何处理这个问题?

是否有像图表这样有用的数据结构或某些DP?我主要担心的是有效的运行时间。

1 个答案:

答案 0 :(得分:3)

您要解决的是maximum-weight independent set问题。这是图论中的一个问题。

数组索引对应于图形的顶点。每个顶点的权重是相应索引处的数组值。在您的示例中,顶点0的权重为8,顶点4的权重为9。

彼此不相似的数组索引对应于图的边缘。例如,顶点0和4之间存在边缘。

您正在寻找一组数组索引,其中没有两个索引彼此不喜欢。就图形而言,您需要一组顶点,其中没有两个顶点通过边连接。这样一组顶点称为独立集。

在所有独立集合中,您需要具有最大顶点权重总和的集合。这是最大权重独立集问题。

此问题的强力方法尝试n个顶点的所有2个 n 子集来确定最大权重。不幸的是,这个问题是NP-hard。人们认为NP-难问题不能在多项式时间内得到解决。换句话说,你不能比蛮力方法做得更好。