原问题出自《算法导论》15.4,问题描述如下:
给定两个序列X和Y,求X和Y长度最长的公共子序列。
利用动态规划算法,自顶向下求解。函数定义如下:输入列表m和n,返回最长公共子序列的长度。
def lcs(m,n):
mlen = len(m)
nlen = len(n)
c = []
for i in range(mlen+1):
c.append([])
for j in range(nlen+1):
c[i].append(-1)
for i in range(mlen+1):
c[i][0] = 0
for j in range(mlen+1):
c[0][j] = 0
for i in range(1,mlen + 1):
for j in range(1,nlen + 1):
if m[i-1] == n[j-1]:
c[i][j] = c[i-1][j-1] + 1
else:
c[i][j] = max(c[i][j-1],c[i-1][j])
return c[mlen][nlen]