對於“最大子序和”與“乘積最大子組數”這類題來說,背后使用的都是相同的思想——Kanade算法:
對於一個給定數組 A,Kadane 算法可以用來找到 A 的最大子段和。這里,我們只考慮非空子段。
Kadane 算法基於動態規划。令 dp[j] 為以 A[j] 結尾的最大子段和。也就是:
那么,以 j+1 j結尾的子段(例如 A[i], A[i+1] + ... + A[j+1])最大化了 A[i] + ... + A[j] 的和。
當這個子段非空那么就等於 dp[j] 否則就等於 0。所以,有以下遞推式:
由於一個子段一定從某個位置截止,所以 就是需要的答案。
為了計算 dp 數組更快,Kadane 算法通常節約空間復雜度的形式表示。我們只維護兩個變量 ans 等於 和 cur 等於 dp[j]。隨着 j 從 0 到 A.length−1 遍歷。
#Kadane's algorithm ans = cur = None for x in A: cur = x + max(cur, 0) ans = max(ans, cur) return ans 作者:力扣 (LeetCode) 鏈接:https://leetcode-cn.com/leetbook/read/dynamic-programming-1-plus/5r2pah/?discussion=SXLmjf 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。