[更早提出类似的问题,但删除了先前的问题并已更改的问题]
对于以下问题程序,必须提供动态编程的解决方法,记忆表的定义,最佳情况和递归步骤。
给定一个长度为n
的字符串,子序列是从左到右读取的任何非空字符子集。例如,如果A = atc
,则a
,t
,c
,at
,tc
,ac
,{{1} }是atc
的所有子序列。给定两个长度为A
,n
的字符串,请设计一种算法,该算法输出两个字符串的最长公共子序列(LCS)的长度。
我想出了以下方法:
m
接下来的三个步骤我还是有点模糊。
据我了解,记忆表可以定义为:
int lcs( char[] X, char[] Y, int m, int n )
{
int L[][] = new int[m+1][n+1];
/* Following steps build L[m+1][n+1] in bottom up fashion. Note
that L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1] */
for (int i=0; i<=m; i++)
{
for (int j=0; j<=n; j++)
{
if (i == 0 || j == 0)
L[i][j] = 0;
else if (X[i-1] == Y[j-1])
L[i][j] = L[i-1][j-1] + 1;
else
L[i][j] = max(L[i-1][j], L[i][j-1]);
}
}
return L[m][n];
}
最好的情况是
memo[i][j] = length of longest substring
递归步骤将是
memo[i][j] = 1
这是了解记忆如何工作的正确方法吗?