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.
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)
def template(*args, **kwargs):
# General template placeholder
pass
Table fill.
Row/col compression possible.