Dynamic 最长公共子序列递归

Dynamic 最长公共子序列递归,dynamic,lcs,Dynamic,Lcs,lcs的重现期为: 你能告诉我为什么是i-1或j-1吗?为什么L[i,j]=L[i-1,j-1]不正确?您正在考虑a[i]!=a[j],这意味着您当前正在比较的两个序列a和B的字母是不同的。因此,最长公共子序列的长度是两件事之一: A减去其第一个字符和B的当前子串的最长公共子序列,即L[i-1,j]; A的最长公共子序列和B的当前子字符串减去其第一个字符,即L[i,j-1]。 如果L[i-1,j-1]是正确的,这意味着A和B中的当前字符都不计数,它们没有机会成为子序列的一部分 请参见示例,注意它

lcs的重现期为:


你能告诉我为什么是i-1或j-1吗?为什么L[i,j]=L[i-1,j-1]不正确?

您正在考虑a[i]!=a[j],这意味着您当前正在比较的两个序列a和B的字母是不同的。因此,最长公共子序列的长度是两件事之一:

A减去其第一个字符和B的当前子串的最长公共子序列,即L[i-1,j]; A的最长公共子序列和B的当前子字符串减去其第一个字符,即L[i,j-1]。 如果L[i-1,j-1]是正确的,这意味着A和B中的当前字符都不计数,它们没有机会成为子序列的一部分


请参见示例,注意它在序列中向前工作,而不是向后。

Awesome。前瞻性方法总结了这一点。
L[i,j] = max(L[i-1,j], L[i,j-1]) if a[i] != a[j]