For given two sequences X and Y, a sequence Z is a common subsequence of X and Y if Z is a subsequence of both X and Y. For example, if X={a,b,c,b,d,a,b} and Y={b,d,c,a,b,a}, the sequence {b,c,a} is a common subsequence of both X and Y. On the other hand, the sequence {b,c,a} is not a longest common subsequence (LCS) of X and Y, since it has length 3 and the sequence {b,c,b,a}, which is also common to both X and Y, has length 4. The sequence {b,c,b,a} is an LCS of X and Y
1≤ length of X and Y ≤1,000
q≤20
, since there is no common subsequence of length 5 or greater.
Write a program which finds the length of LCS of given two sequences X
and Y. The sequence consists of alphabetical characters.
Input
The input consists of multiple datasets. In the first line, an integer q
which is the number of datasets is given. In the following 2×q lines, each dataset which consists of the two sequences X and Yare given.
Output
For each dataset, print the length of LCS of X
and Yin a line.
Constraints
- 1≤q≤150
1≤ length of X and Y ≤1,000
q≤20
- if the dataset includes a sequence whose length is more than 100
Sample Input 1
3 abcbdab bdcaba abc abc abc bc
Sample Output 1
4 3 2
Reference
Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.
#include<bits/stdc++.h>
using namespace std;
const int N(1050);
char s[N],t[N];
int c[N][N];
int main(){
//freopen("in.txt","r",stdin);
int z;
cin>>z;
while(z--){
scanf("%s%s",s,t);
int n=strlen(s);
int m=strlen(t);
memset(c,0,sizeof(c));
int mm=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(s[i-1]==t[j-1])
c[i][j]=c[i-1][j-1]+1;
else c[i][j]=max(c[i-1][j],c[i][j-1]);
mm=max(c[i][j],mm);
}
cout<<mm<<endl;
}
//fclose(stdin);
}