Algorithm 将一个序列分成两个连续的子阵列';一个从左边开始,另一个从右边开始,这样两者的总和最小?
我们不需要将每个元素都分布在两个子序列中的一个子序列中,我们可以留下元素,但是所取的元素必须从最左边或最右边的元素开始形成一个连续的子阵列。集合可以是空的 例如Algorithm 将一个序列分成两个连续的子阵列';一个从左边开始,另一个从右边开始,这样两者的总和最小?,algorithm,recursion,dynamic-programming,Algorithm,Recursion,Dynamic Programming,我们不需要将每个元素都分布在两个子序列中的一个子序列中,我们可以留下元素,但是所取的元素必须从最左边或最右边的元素开始形成一个连续的子阵列。集合可以是空的 例如 Given 1 -1 -1 -1 The two sets can be {},{-1,-1,-1 } => -3 Given -1, -1, -1, -1, 1 ,1, 1,-1 The two sets can be {-1,-1,-1,-1},{-1} => -5 Given 1, 1, 1, 1, -3,
Given
1 -1 -1 -1
The two sets can be
{},{-1,-1,-1 } => -3
Given
-1, -1, -1, -1, 1 ,1, 1,-1
The two sets can be
{-1,-1,-1,-1},{-1} => -5
Given
1, 1, 1, 1, -3, 12, 1, 1, 9
The two sets can be
{},{} => 0
如何有效地做到这一点
注意:我们关心的不是实际集合,而是最小集合。假设您从左侧计算累积总和。这是Θ(n)。从右侧开始的累积和同上。从右边开始,对于每个条目i,注意索引j,使得j>i,并且j,…,n中条目的累积和c是最低的。这也可以在Θ(n)中完成。(请注意,您刚刚执行了三个累积操作:两个累积和,一个累积分钟(在右侧的累积和上)——显然这可以在线性时间内完成。) 在这里,在Θ(n)处,您已经执行了预处理,使您能够在固定时间内回答查询:给定索引i:
- i左边的累计和是多少
- i右边的指数j是什么,它最小化了从右边到j的累积和
现在从左边绕过去一圈。对于每个i,求两个和的和:从左侧开始累积,从右侧开始最小累积。返回最低的总和 总体复杂度为Θ(n)