我在编程竞赛网站上遇到过这个问题,并且已经尝试了几天不同的事情,但是它们似乎都不够高效。
这是一个问题:给你一个大的整数数组和一个数字k。目标是将数组划分为每个包含不超过k个元素的子数组,以使所有子数组中所有元素的总和最大。另一个条件是这些子阵列中没有一个可以彼此相邻。换句话说,我们必须从原始数组中删除一些术语。
它一直困扰我一段时间,并希望听到你对解决这个问题的看法。
答案 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,因为在此级别上它可以像伪代码一样被读取。