Longest Increasing Subsequence

Longest strictly increasing chain within a sequence. dp[i] = the best chain ending at position i, extending any smaller earlier element.

Category
Dynamic Programming
Time complexity
O(n²)
Space complexity
O(n)

Pseudocode

dp[i] ← 1
extend any smaller earlier value
dp[i] = max(dp[j]+1) for a[j]<a[i]
answer = max(dp)

Reference implementation

for i in range(n):
    dp[i] = 1 + max((dp[j]
        for j in range(i)
        if a[j] &lt; a[i]), default=0)

Open the interactive Longest Increasing Subsequence visualisation →