最长公共子序列【东北大学oj数据结构10-3】C++
题面
对于给定两个序列 X 和 Y , 序列 Z 是 X 和 Y 的公共子序列是指如果 Z 同时是 X 和 Y 的子序列。
例如:如果 X = {a, b, c, b, d, a, b} 和 Y = {b, d, c, a, b, a} ,
那么序列 {b, c, a} 是 X 和 Y 的一个公共子序列。
但是序列 { b , c, a } 不是 X 和 Y 的最长公共子序列(LCS) , 因为它的长度是3。
而序列 {b,c,b,a} ( X 和 Y 都有这个序列)的长度是 4, 又没有长度大于或等于 5 的公共子序列,所以序列 {b,c,b,a} 是 X 和 Y 的最长公共子序列。
编写一个程序,找出给定的两个序列 X 和 Y 的LCS的长度。
输入
输入由多个数据集组成。
在第一行中,给出了一个整数 q,它是数据集的数量。
在下面的 2 × q 行中,给出了由两个序列 X 和 Y 组成的每个数据集。
输出
对于每个数据集,在一行中打印 X 和 Y 的 LCS 长度。
约束
1≤q≤150
1≤X和Y的长度≤1000
如果数据集包含长度大于100的序列,则Q≤20
输入样例
3
abcbdab
bdcaba
abc
abc
abc
bc
输出样例
4
3
2
代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=0;i<n;i++)
{
string a;
string b;
cin>>a>>b;
int x=a.size();
int y=b.size();
vector<vector<int> > dq(x+1,vector<int>(y+1,0));
for(int j=0;j<x;j++)
{
for(int k=0;k<y;k++)
{
if(a[j]==b[k])
{
dq[j+1][k+1]=dq[j][k]+1;
}
else
{
dq[j+1][k+1]=max(dq[j+1][k],dq[j][k+1]);
}
}
}
cout<<dq[x][y]<<endl;
}
return 0;
}