【问题标题】:Maximizing the overall sum of K disjoint and contiguous subsets of size L among N positive numbers最大化 N 个正数中大小为 L 的 K 个不相交和连续子集的总和
【发布时间】:2015-03-25 23:27:11
【问题描述】:

我正在尝试找到一种算法来查找数组x 的大小为L 的不相交的连续子集,该数组由最大化元素总和的实数组成。

拼出细节,X是一组N个正实数:
X={x[1],x[2],...x[N]} where x[j]>=0 for all j=1,...,N.

称为S[i] 的长度为 L 的连续子集定义为 X 的 L 个连续成员,从位置 n[i] 开始,到位置 n[i]+L-1 结束:
S[i] = {x[j] | j=n[i],n[i]+1,...,n[i]+L-1} = {x[n[i]],x[n[i]+1],...,x[n[i]+L-1]}.

如果|n[i]-n[j]|>=L,则两个这样的子集S[i]S[j] 称为成对不相交(非重叠)。换句话说,它们不包含任何相同的 X 成员。

定义每个子集成员的总和:

SUM[i] = x[n[i]]+x[n[i]+1]+...+x[n[i]+L-1];

目标是找到 K 个连续且不相交(不重叠)的子集 S[1],S[2],...,S[K],长度为 L,使得 SUM[1]+SUM[2]+...+SUM[K] 最大化。

【问题讨论】:

  • 忘了说 N > K*L 这样 K 个子集不会覆盖所有 N 个元素。

标签: algorithm dynamic-programming subset np-hard


【解决方案1】:

这是通过动态规划解决的。让M[i] 成为仅针对x 的第一个i 元素的最佳解决方案。那么:

M[i] = 0 for i < L
M[i] = max(M[i-1], M[i-L] + sum(x[i-L+1] + x[i-L+2] + ... + x[i]))

您的问题的解决方案是M[N]

在编写代码时,您可以增量计算总和(或简单地预先计算所有总和),从而在空间和时间上得到 O(N) 解决方案。

如果您必须准确地找到K 子集,您可以扩展它,将M[i, k] 定义为在第一个i 元素上使用k 子集的最佳解决方案。那么:

M[i, k] = 0 for i < k * L or k = 0.
M[i, k] = max(M[i-1, k], M[i-L, k-1] + sum(x[i-L+1] + ... + x[i])

您的问题的解决方案是M[N, K]

这是一个二维动态规划解决方案,时间和空间复杂度为 O(NK)(假设您使用与上述相同的技巧来避免重新计算总和)。

【讨论】:

  • 非常感谢您的回答。 M[N,K] 求最大总和。为了找到最好的子集,我想我们应该从 M[N,K] 回溯到 M[1,0] 并找到子集的起始位置。
猜你喜欢
  • 2015-08-14
  • 2013-08-06
  • 2017-09-09
  • 2023-03-09
  • 2013-03-05
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多