最大子段和

14 分钟

给一串可正可负的数,求连续一段的最大和。比如 2 -1 3 的答案是 4(整段 2+(-1)+3)。

定义状态

dp[i] = 以第 i 个数结尾的最大连续和。"以 i 结尾"是关键——它保证选出的这一段是连续的。

转移:要么接上,要么另起

到第 个数,只有两个选择:

  • 接在前面那段后面:
  • 自己另起一段:(当前面那段是负数、只会拖后腿时)

取较大者:

答案是所有 里的最大值——因为事先不知道最优段在哪结尾。

int best=a[0], dp=a[0];
for(int i=1;i<n;i++){
    dp = max(a[i], dp + a[i]);
    best = max(best, dp);
}
// best 即答案,复杂度 O(n)

这个"以 结尾"的设状态套路,在 DP 里会一再出现,务必吃透。

小纸条

序列 2 -1 3 的最大子段和是多少?

登录 后可看答案

最大子段和 · 算法进阶 · op599 课程