描述
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=x1, x2,…, xm,则另一序列Z=z1, z2,…, zk是X的子序列是指存在一个严格递增的下标序列 i1, i2,…, ik,使得对于所有j=1,2,…,k有:
Xij = Zj
如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。
求A、B所有公共子序列中最长的序列的长度。
输入
输入共两行,每行一个由字母和数字组成的字符串,代表序列A、B。A、B的长度不超过200个字符。
输出
一个整数,表示最长各个子序列的长度。
格式:printf(“%d\n”);
输入样例
programming
contest
输出样例
2
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXSIZE 205
using namespace std;
char str1[MAXSIZE],str2[MAXSIZE];
int len[MAXSIZE][MAXSIZE];
int max(int a,int b){
return a>b?a:b;
}
int maxlen(int m,int n){
if(len[m][n]!=0)return len[m][n];
if(m<0||n<0)return 0;
if(str1[m]==str2[n]){
len[m][n] = maxlen(m-1,n-1)+1;
return len[m][n];
}
else{
len[m][n] = max(maxlen(m-1,n),maxlen(m,n-1));
return len[m][n];
}
}
int main()
{
int m,n;
gets(str1);
gets(str2);
m = strlen(str1);
n = strlen(str2);
printf("%d\n",maxlen(m-1,n-1));
return 0;
}