1. 程式人生 > >最長公共子序列(dp)

最長公共子序列(dp)

題目描述

給你一個序列X和另一個序列Z,當Z中的所有元素都在X中存在,並且在X中的下標順序是嚴格遞增的,那麼就把Z叫做X的子序列。
例如:Z=<a,b,f,c>是序列X=<a,b,c,f,b,c>的一個子序列,Z中的元素在X中的下標序列為<1,2,4,6>。
現給你兩個序列X和Y,請問它們的最長公共子序列的長度是多少?

 

輸入

輸入包含多組測試資料。每組輸入佔一行,為兩個字串,由若干個空格分隔。每個字串的長度不超過100。

 

輸出

對於每組輸入,輸出兩個字串的最長公共子序列的長度。

 

樣例輸入

abcfbc abfcab
programming contest 
abcd mnp

 

樣例輸出

4
2
0

程式碼:

#include<stdio.h>
#include<string.h>
char a[110],b[110];
int dp[110][110];
int maxn(int x,int y)
{
	if(x>=y)
		return x;
	return y;
}
int main()
{
	int lena,lenb,i,j;
	while(scanf("%s%s",a,b)!=EOF)
	{
	    lena=strlen(a);
	    lenb=strlen(b);
	    memset(dp,0,sizeof(dp));
	    for(i=1;i<=lena;i++)
	    for(j=1;j<=lenb;j++)
	    {
		if(a[i-1]==b[j-1])
		    dp[j][i]=dp[j-1][i-1]+1;
		else
		    dp[j][i]=maxn(dp[j-1][i],dp[j][i-1]);
	    }
	    printf("%d\n",dp[lenb][lena]);
	}
    return 0;
 }