对于“最大子序和”与“乘积最大子组数”这类题来说,背后使用的都是相同的思想——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) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。