用于找到一组非相邻子阵列的高效算法,使其总和最大化

时间:2012-04-24 14:37:19

标签: algorithm

我在编程竞赛网站上遇到过这个问题,并且已经尝试了几天不同的事情,但是它们似乎都不够高效。

这是一个问题:给你一个大的整数数组和一个数字k。目标是将数组划分为每个包含不超过k个元素的子数组,以使所有子数组中所有元素的总和最大。另一个条件是这些子阵列中没有一个可以彼此相邻。换句话说,我们必须从原始数组中删除一些术语。

它一直困扰我一段时间,并希望听到你对解决这个问题的看法。

3 个答案:

答案 0 :(得分:3)

动态编程应该可以解决问题。简短解释原因:

易受动态编程影响的问题的关键属性是问题的最佳解决方案(这里:整个数组)总是可以表示为子问题的两个最优解的组合(这里:两个子阵列)。不是每个分裂需要具有此属性 - 对于任何最佳解决方案而言,存在一个此类拆分就足够了。

显然,如果在数组之间(在已经被删除的元素上)拆分最优解,那么子解码在两个子阵列中都是最佳的。

算法:

依次尝试数组的每个元素作为分裂元素,寻找产生最佳结果的元素。以递归方式解决数组的两个部分(当子数组不超过k时递归停止)。记住解决方案以避免指数时间(递归显然会多次尝试相同的子阵列。)

答案 1 :(得分:0)

这不是解决方案,而是线索。

考虑解决以下问题:

从数组X中选择元素作为元素的子集,使得它们彼此不相邻且它们的总和最大。

现在,上述问题是您的问题的一个特例,其中K = 1。想一想如何将解决方案扩展到一般情况。如果您不知道如何解决更简单的案例,请告诉我。

答案 2 :(得分:0)

我没有时间解释为什么这样做有效,应该成为公认的答案:

def maxK(a, k): 
    states = k+1
    myList = [0 for i in range(states)]
    for i in range(0, len(a)): 
        maxV = max (myList)
        myList = [a[i] + j for j in myList]
        myList[(states-i) % k] = maxV  
    return max(myList) 

这也适用于负数。这是size(a)乘以k的线性值。我使用的语言是Python,因为在此级别上它可以像伪代码一样被读取。