【发布时间】:2014-03-04 20:16:02
【问题描述】:
我得到了一个数字序列a_1,a_2,...,a_n。它的总和是S=a_1+a_2+...+a_n,我需要找到一个子序列a_i,...,a_j,使得min(S-(a_i+...+a_j),a_i+...+a_j) 是最大可能的(两个总和都必须非空)。
例子:
1,2,3,4,5 序列是3,4,因为那是min(S-(a_i+...+a_j),a_i+...+a_j)=min(8,7)=7(它是最大可能的,可以检查其他子序列)。
我努力做到这一点。
我将所有值加载到数组tab[n]。
我这样做n-1 次tab[i]+=tab[i-j]。所以tab[j] 是从开始到j 的总和。
我检查所有可能的总和 a_i+...+a_j=tab[j]-tab[i-1] 并从总和中减去它,取最小值,看看它是否比以前大。
需要O(n^2)。这让我非常难过和痛苦。有没有更好的办法?
【问题讨论】:
-
数字可以是负数吗?
-
不,都是正面的。
标签: algorithm