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