最长公共子序列问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定两个序列X=
输入
输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。
输出
每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。
示例输入
ABCBDAB BDCABA
示例输出
4
与 uva 10100 很是相是,但简单了许多,比较的是单个字符,不是单词,也不用考虑其他字符
#include <iostream> #include <cstdio> #include <cstring> #include <string> using namespace std; struct node { int num; char w[510]; }; void devide (char s[],node &t) { int len=strlen(s); t.num=0; for(int i=0;i<len;i++) t.w[++t.num]=s[i]; } int main() { char a[510],b[510]; while(gets(a)) //须用gets { node t1,t2; devide(a,t1); gets(b); devide(b,t2); int f[510][510]; memset(f,0,sizeof(f)); for(int i=1;i<=t1.num;i++) for(int j=1;j<=t2.num;j++) { f[i][j]=max(f[i-1][j],f[i][j-1]); if(t1.w[i] == t2.w[j]) { f[i][j]=max(f[i][j],f[i-1][j-1]+1); } } cout<<f[t1.num][t2.num]<<endl; } return 0; }