动态规划

最大子数组和

最大子数组和要求从数组里找一段连续子数组,让它的和最大。经典例子里 [4, -1, 2, 1] 的和是 6。

Kadane 算法把问题压成一个一维 DP:

dp[i] = 必须以 a[i] 结尾的最大子数组和

对每个位置只有两个选择:

  • a[i] 重新开始
  • 接上前一段:dp[i - 1] + a[i]

所以转移是:

dp[i] = max(a[i], dp[i - 1] + a[i])

同时维护全局最大的 best,就能在线性时间得到答案。

复杂度

  • 时间:O(n)
  • 空间:O(n)(动画保留了 dp 表;实际代码可压到 O(1))

在动画里看什么

  • a 行是原数组,dp 行是“以当前位置结尾”的最好结果
  • 深蓝是当前处理的位置
  • 暖红是目前找到的全局最优连续区间
  • best 显示当前最大和以及对应的左右边界