【发布时间】: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