??? question "若不能選到空的子序列 ?" 有些題目可以直接在轉移式維護,但令一個 general 的作法是: 一樣在過程中將答案跟 0 取 max,當答案為 0 時,直接回傳陣列中最大的元素(因為此時陣列一定全是負的) ## 環狀最大連續子序列 ???+note "[LeetCode 918. Maximum Sum Circular Subarray](https://leetcode.com/problems/maximum-sum-circular-subarray/)" 給一個長度為 $n$ 的環形陣列 $a_1, \ldots ,a_n$,問最大連續子陣列,不能到選空的 $n\le 3\times 10^4, -3\times 10^4\le a_i\le 3\times 10^4$ 我們分成兩種 case 討論: 1. Maximum Subarray 不是環狀的 2. Maximum Subarray 是環狀的 Case 1. 就是我們一般陣列上的問題,那 Case 2. 的話,我們其實就是 sum(a[i]) - min subarray sum,我們將兩種取 max 即可,也就是 ans = max{max_subarray, total_sum - min_subarray} ??? info "簡易證明" $$\begin{align} \max(\texttt{pre} + \texttt{suf}) &= \max(\texttt{total sum} - \texttt{subarray}) \\ &= \texttt{total sum} + \max(-\texttt{subarray}) \\ &= \texttt{total sum} - \min(\texttt{subarray}) \end{align}$$ ## 練習題 ???+note "[全國賽模擬賽 2022 pB. 更加 Trivial 的題目 (Quadrivial)](https://www.csie.ntu.edu.tw/~b11902109/PreNHSPC2022/IqwxCSqc_Pre_NHSPC_zh_TW.pdf#page=5)" 給 n 個陣列 $a_1, \ldots ,a_n$,問這些陣列以任意順序組合起來 Maximum Subarray Sum 最大是多少 $n\le 10^5, \sum |a_i| \le 10^6, |a_{i, j}| \le 10^9$ ??? note "思路" 先想 O(n^2) 怎麼做,我們可以預處理每個陣列的前綴最大值 pre[i],後綴最大值 suf[i],然後枚舉左右,但這時,我們要怎麼計算中間的貢獻 ? 我們令 sum[i] = max(陣列 i 的總和, 0),當左為 l, 右為 r 時,答案就是