DP over sequences for edit distance, LCS, and palindromic subsequences
dp[i][j] compares prefixes up to i, j; transitions depend on equal/mismatch cases.
Use when aligning two strings or reverse of one string.
2D DP over prefixes with match/mismatch transitions (edit distance/LCS/LPS); compress to 1D by scanning in the correct order.
# Knapsack Templates (0/1)
def knapsack_01(weights, values, W):
dp=[0]*(W+1)
for w,v in zip(weights, values):
for c in range(W, w-1, -1):
dp[c]=max(dp[c], dp[c-w]+v)
return dp[W]Min ops convert s→t
def edit_distance(s, t):
n,m=len(s),len(t); dp=[[0]*(m+1) for _ in range(n+1)]
for i in range(n+1): dp[i][0]=i
for j in range(m+1): dp[0][j]=j
for i in range(1,n+1):
for j in range(1,m+1):
if s[i-1]==t[j-1]: dp[i][j]=dp[i-1][j-1]
else: dp[i][j]=1+min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
return dp[n][m]Longest common subsequence
def lcs(s, t):
n,m=len(s),len(t); dp=[[0]*(m+1) for _ in range(n+1)]
for i in range(1,n+1):
for j in range(1,m+1):
dp[i][j]=dp[i-1][j-1]+1 if s[i-1]==t[j-1] else max(dp[i-1][j], dp[i][j-1])
return dp[n][m]LPS via reverse or 2D DP
def lps(s):
t=s[::-1]; return lcs(s,t)Table fill.
Row/col compression possible.