Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 59599 | Accepted: 24845 |
Description
Input
Output
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
Source
題意:給你兩個序列,讓你求他們的最長公共子序列的長度。
值得注意的是:公共子序列不是公共子串。
列如:X={3,0,2,5,1,7,6,4},它的子序列可以爲{3,5,4}。但其子串爲位置相臨近的幾個元素,如{2,5,1,7}。
最長公共子序列的求法參看網址:
題解:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
#define M(a,b) memset(a,b,sizeof(a))
const int MAXN=1005;
int c[MAXN][MAXN];
int main()
{
char s1[MAXN];
char s2[MAXN];
while(~scanf("%s",&s1))
{
scanf("%s",&s2);
int n=strlen(s1);
int m=strlen(s2);
M(c,0);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s1[i]==s2[j])///字符s1[i]與s2[j]相等,c[i][j]= c[i-1,j-1] + 1。
c[i+1][j+1]=c[i][j]+1;
else
c[i+1][j+1]=max(c[i][j+1],c[i+1][j]);///否則,取c[i-1,j] 和 c[i,j-1]的最大值
}
}
printf("%d\n",c[n][m]);
}
return 0;
}