Linear DP over arrays or sequences: Kadane, House Robber, Stocks, LIS
dp[i] summarizes optimal value up to i using transitions from previous states.
Use when the subproblem depends on a fixed number of previous positions.
Max subarray ending at i
def kadane(nums):
best = cur = nums[0]
for x in nums[1:]:
cur = max(x, cur + x)
best = max(best, cur)
return best
dp[i]=max(dp[i-1],dp[i-2]+val)
def house_robber(nums):
prev2 = 0; prev1 = 0
for x in nums:
prev2, prev1 = prev1, max(prev1, prev2 + x)
return prev1
State machine for buy/sell/cooldown
def max_profit_one_tx(prices):
minp = float('inf'); best = 0
for p in prices:
minp = min(minp, p); best = max(best, p - minp)
return best
n log n with tails or O(n^2) DP
from bisect import bisect_left
def lis_length(nums):
tails=[]
for x in nums:
i=bisect_left(tails, x)
if i==len(tails): tails.append(x)
else: tails[i]=x
return len(tails)
def template(*args, **kwargs):
# General template placeholder
pass
Linear or n log n for LIS.
Rolling vars or arrays.