guest@cp-base:~/home/dp$
templates/kadane.cpp
compilable
$cat templates/kadane

Kadane's Algorithm

Maximum contiguous subarray sum in O(n) time using linear DP.

#kadane#maximum-subarray#dp#linear
Log in to track progress, save custom versions, and organize into collections.Log In
$cat source_code/
cpp
01
02
03
04
05
06
07
08
09
10
11
12
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll kadane(const vector<ll> &arr) {
    ll best = 0, cur = 0;
    for (ll x : arr) {
        cur = max(x, cur + x);
        best = max(best, cur);
    }
    return best;
}
12 linesutf-8
$cat explanation_notes.md
notes_viewer --renderedmarkdown (math enabled)

Kadane's Algorithm

Finds the maximum sum of a contiguous subarray in O(n)O(n).

Recurrence

Let dp[i]dp[i] = maximum subarray sum ending at index ii:

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

  • a[i]a[i]: start a new subarray here

  • dp[i1]+a[i]dp[i-1] + a[i]: extend the previous subarray
  • The answer is max0i<ndp[i]\max_{0 \le i < n} dp[i].

    Notes

  • This version returns 0 for all-negative arrays (empty subarray allowed). To require at least one element, initialize both variables to arr[0] and loop from index 1

  • Space-optimized: only two variables instead of a full DP array
  • When to Use

  • Maximum subarray sum

  • Maximum sum submatrix (apply Kadane per column-compressed row)

  • As a subroutine in divide-and-conquer or 2D problems
  • Complexity

  • Time — O(n)O(n)

  • Space — O(1)O(1)