[未完成][基础算法 && 进阶数据结构] 最大子段和 && 子段和线段树

最大子段和O(n)  dp:

一句话,dp[n] = max(dp[n - 1] + arr[n], dp[n])

 

 

最大子段和O(nlogn) 分治:

假设在区间 [left, right]中的最大字段和区间为[i, j],设mid = (left + right) / 2 ,那么一定会是以下三种情况其一:

  1. left <= i <= mid <= j <=right
  2. left <= i <= j <= mid
  3. mid+1 <= i <= j <= right

因此我们只需要求出以上三种情况中最大值即可。

对于1,mid是包括在[i, j]集合中的,只需要分别从 left ← mid 以及 mid → right 分别枚举得到使区间最大值的 i 与 j,再两个相累加

对于2,我们使 right = mid,重新求 mid 进行二分缩减,再分别讨论 1~3 的情况  (base case: left = right)

对于3,同理,我们使 left = mid + 1,重新 mid 进行二分缩减,再分别讨论 1~3 的情况 (base case: left = right)

 

posted @ 2022-01-05 23:41  蒟蒻zExNocs  阅读(40)  评论(0)    收藏  举报