BISHI134 最大子段和¶
简单通过率 39.38%python3样例通过牛客 AC
讲解章节:线性 DP
一句话
选一个非空连续子数组使元素和最大。
解题思路¶
这题考什么¶
Kadane 算法(最大子段和的线性 DP)。设 f_i = 「以 i 结尾」的最大子段和:
含义:要么把前面那段接上(前提是它是正贡献),要么从 i 重新开始。 答案 = max f_i。
等价视角:设前缀和 S,则答案 = max_{i} (S_i - min_{j<i} S_j), 也就是「一边扫一边记录历史最小前缀和」。两种写法完全等价。
数据规模与复杂度¶
n <= 2e5,O(n) 时间、O(1) 空间。 枚举左右端点是 O(n^2) = 4e10,必挂。
坑在哪¶
- 要求非空,所以答案初值必须是 a_1(或 -inf),不能是 0—— 全负数组时答案是最大的那个负数,初值取 0 会错误地输出 0;
- a_i 可以是负数,
max(f, 0)的 0 是「放弃前面这段」而不是「和为 0 的空段」, 因为 f_i 里必定含 a_i,非空性有保证; - n = 1 时直接输出 a_1。
参考实现¶
[:octicons-arrow-left-16: BISHI133](BISHI133.md) [BISHI135 :octicons-arrow-right-16:](BISHI135.md)