10
9
2
5
3
7
101
18
[0][1][2][3][4][5][6][7]
dp
·
·
·
·
·
·
·
·
[0][1][2][3][4][5][6][7]
DP on ending index (O(n²))
▸1n = len(nums)2dp = [1] * n // each element alone3for i in 0..n−1:4 for j in 0..i−1:5 if nums[j] < nums[i]: // smaller predecessor6 dp[i] = max(dp[i], 1 + dp[j])7return max(dp)
state
- nums[10, 9, 2, 5, 3, 7, 101, 18]
- recurrencedp[i] = 1 + max(dp[j] | j<i, nums[j]<nums[i])