RECONSTRUCT-LCS(c, X, Y, m, n) k = c[m, n] let l[1 : k] be a new array while m > 0 and n > 0 if X[m] == Y[n] l[c[m, n]] = X[m] m = m - 1 n = n - 1 else if c[m, n] == c[m - 1, n] m = m - 1 else n = n - 1 return l
MEMOIZED-LCS-LENGTH(X, Y, i, j, b, c) if i == 0 or j == 0 c[i, j] = 0 return 0 else if c[i, j] != -1 return c[i, j] else if X[i] == Y[j] c[i, j] = MEMOIZED-LCS-LENGTH(X, Y, i - 1, j - 1, b, c) + 1 b[i, j] = "↖" else u = MEMOIZED-LCS-LENGTH(X, Y, i - 1, j, b, c) l = MEMOIZED-LCS-LENGTH(X, Y, i, j - 1, b, c) if u >= l c[i, j] = u b[i, j] = "↑" else c[i, j] = l b[i, j] = "←" return c[i, j]
LCS-LENGTH1(X, Y, m, n) if m < n swap X with Y swap m with n let c[0 : 2, 0 : n] be new table for j = 0 to n c[0, j] = 0 c[1, 0] = 0 for i = 1 to m for j = 1 to n if X[i] == Y[j] c[i mod 2, j] = c[1 - (i mod 2), j - 1] + 1 else c[i mod 2, j] = max{c[i mod 2, j - 1], c[1 - (i mod 2), j]} return c[m mod 2, n]
LCS-LENGTH2(X, Y, m, n) if m < n swap X with Y swap m with n let c[0 : n] be new array for j = 0 to n c[j] = 0 for i = 1 to m prev = c[0] for j = 1 to n temp = c[j] if X[i] == Y[j] c[j] = p + 1 else c[j] = max{c[j - 1], c[j]} prev = temp return c[n]
LIS-LENGTH(X, m) let c[0 : m] be new array X[0] = −∞ for i = 0 to m f[i] = 0 for j = 0 to i - 1 if X[j] <= X[i] f[i] = max{f[i], f[j] + 1} q = 0 for i = 1 to m q = max{q, f[i]} return q
$\star$ 14.4-6
1 2 3 4 5 6 7 8 9 10 11
LIS-LENGTH(X, m) let a[1 : m] be new array n = 0 for i = 1 to m: if n == 0 or X[i] >= a[n] n += 1 a[n] = X[i] else let j ∈ [1, 2, ..., n] be the largest index s.t. a[j] > X[i] a[j] = X[i] return n