abcfbc abfcab programming contest abcd mnp
4 2 0
这道题就是求最大公共子序列的长度。
不知道怎么解释。
只好打了个草图。
#include <stdio.h>
#include <string.h>
#define max(a,b) a>b?a:b
char s[520];
char s1[520];
int lcs[520][520];
int LCS(int l,int l1)
{
int i,j; //将两列字符窜变成i行,j列。lsc数组代表每一个位置的最大公共子序列的长度。
for(i=1;i<=l;i++)
for(j=1;j<=l1;j++) //将s[i-1]分别和s1的每一个元素做比较
{
if(s[i-1]==s1[j-1]) //碰到相等的。
lcs[i][j]=lcs[i-1][j-1]+1;//图中加一的情况
else
lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);//碰到不相等的,则取它的上方和左方的那个的最大值,图中都为一。以此累加
}
return lcs[l][l1]; //到达最后的状态必然是最大的长度,图中的长度为2,最大公共子序列可以是ca或者ab。
}
int main()
{
while(scanf("%s%s",s,s1)!=EOF)
{
int l=strlen(s);
int l1=strlen(s1);
memset(lcs,0,sizeof(lcs));
printf("%d\n",LCS(l,l1));
}
return 0;
}
HDU 1159 Common Subsequence 最大公共子序列
原文:http://blog.csdn.net/sky_miange/article/details/43675293