Longest Common subsequence (LCS) and longest sequence lcs

[Description]: two strings s1s2... are given ...... Sn and t1 t2 ...... Tn. Find the longest length of the two strings that are common to your sub-sequence. String s1 s2 ...... The sub-sequence of sn indicates that it can be expressed as si1 i2 ...... Si n (i1 <i2 <i3 <...... <Im ).

Example:

N = 4;

M = 4

S = "abcd"

T = "becd"

Output:

3 (bcd)

[Analysis]: We can use dynamic planning to solve this classic longest public subsequence problem. We will use the following methods to define it.

Dp [I] [j] indicates the length of the longest common subsequence of the two output sequences.

Therefore, the common subcolumns of the two subsequences may be:

1. When the I + 1 element of the S sequence is the same as the I + 1 element of the T sequence ...... Si and T1 ...... Add S (I + 1) to the end of the public subcolumn OF Ti)

2. s1 ...... Si and t1 ...... T (j + 1.

3. s1 ...... S (I + 1) and t1 ...... Tj public subcolumns.

One of the three, so we can write the recursive relationship of dp:

That is:

#include<iostream>using namespace std;int n,m;char s[1000],t[1000];int dp[1001][1001];int main(){cin>>n>>m;for(int i = 0;i<n;i++)cin>>s[i];for(int j = 0;j<m;j++)cin>>t[j];for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(s[i] == t[j])dp[i+1][j+1] = dp[i][j] + 1;elsedp[i+1][j+1] = max(dp[i][j+1],dp[i+1][j]);}}cout<<dp[n][m]<<endl;return 0;}

PASCAL Implementation of LCS (longest common subsequence)

Sorry, I have previously given the longest public substring. Do you want to ask this question? Problem: "We know that ALRIs and his younger brother alria have basically the same genes. it is inconvenient to express these genes, so it is represented by n numbers. (Since 100000 genes have been found so far, each number <= 100000) has the same number of genes, that is, they all have n numbers. And for each person, the n numbers are different from each other. The longest common part of genes between siblings is required. It can be discontinuous ."

Line 2 of the Input file LCS. IN is n (1 <= n <= 1st) and n numbers IN each row, indicating all genes of a person.

The Output file LCS. OUT contains the length of the longest common part of the two genes.

Sample Input Sample Output

7 3

1 2 3 4 5 6 7

7 6 5 4 1 2 3

Program for you

Var n, I, j: longint;

A, B, numa, numb: array [1 .. 100000] of longint;

Procedure qsrta (h, t: longint );

Var I, j, k, x, y: longint;

Begin

If h> = t then exit;

K: = random (t-h + 1) + h;

X: = a [k]; a [k]: = a [h]; a [h]: = x;

Y: = numa [k]; numa [k]: = numa [h]; numa [h]: = y;

I: = h; j: = t;

While I <j do begin

While (I <j) and (a [j]> x) do dec (j );

If I <j then begin a [I]: = a [j]; numa [I]: = numa [j]; inc (I); end;

While (I <j) and (a [I] <x) do inc (I );

If I <j then begin a [j]: = a [I]; numa [j]: = numa [I]; dec (j); end;

End;

A [I]: = x; numa [I]: = y;

Qsrta (h, I-1); qsrta (I + 1, t );

End;

Procedure qsrtb (h, t: longint );

Var I, j, k, x, y: longint;

Begin

If h> = t then exit;

K: = random (t-h + 1) + h;

X: = B [k]; B [k]: = B [h]; B [h]: = x;

Y: = numb [k]; numb [k]: = numb [h]; numb [h]: = y;

I: = h; j: = t;

While I <j do begin

While (I <j) and (B [j]> x) do dec (j );

If I <j then begin B [I]: = B [j]; numb [I]: = numb [j]; inc (I); end;

While (I <j) and (B [I] <x) do inc (I );

If I <j then begin B [j]: = B [I]; numb [j]: = numb [I]; dec (j); end;

End;

B [I]: = x; numb [I]: = y;

Qsrtb (h, I-1); qsrtb (I + 1, t );

End;

Procedure qsrtnumab (h, t: longint );

Var ...... remaining full text>

Matlab recursion solves the longest common subsequence (LCS) Problem

Recursion is not good, and time is slow; recursion is VC. MATLAB is different from VC, and it uses matrices for calculation;