ブロックはオーバーラップできません。また、隣接することもできません。A の長さが > 2 であると仮定します。
これは、最大サブアレイの合計を見つけるのと非常によく似ており、線形時間で実行できることを知っています。
また、アルゴリズムが最大部分配列の問題を見つけるのと同じように開始されることも確信しています。
これは数日前に聞いた問題で、解決方法を知りたいと思っています。
max-subarray-algorithm を 2 回実行できます。
def max_two_sub_array():
sum = l[0] = ls[0] = 0
for i = 1 to n:
sum += a[i]
if sum < 0: sum = 0
if l[i - 1] > sum:
l[i] = l[i - 1]
ls[i] = ls[i - 1] # endpoint of l[i]
else
l[i] = sum
ls[i] = i
sum = r[n + 1] = 0
rs[n + 1] = n + 1
for i = n to 1:
sum += a[i]
if r[i + 1] > sum:
r[i] = r[i + 1]
rs[i] = rs[i + 1] # startpoint of r[i]
else
r[i] = sum
rs[i] = i
ans = 0
for i = 0 to n:
ans = max(ans, l[i] + r[i + 1])
return ans
2 ステップ:
O(n) を使用して、配列全体の最大合計のブロックを見つけます。ブロックが a[i] から始まり、a[j] で終わり、合計が S1 であるとします。
O(n) を使用して、前のブロックの合計が最小のブロックを見つけます。合計を S2 とします。
最終的な答えは S1-S2
いくつかの境界ケースを考慮する必要があります。
配列が 1,2,3,2,1 の場合。ステップ1は配列全体をブロックとして返します。ステップ 2 は 1 を返しますが、これは 2 つのブロックが隣接してはならないという要求に違反しています。したがって、ステップ 2 では、a[i+1] から始まり a[j-1] で終わるアルゴリズムを適用する必要があります。