Kanade算法


對於“最大子序和”與“乘積最大子組數”這類題來說,背后使用的都是相同的思想——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]。隨着 j0 到 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)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM