hdu1503

/*
分析:
    水题~,水水更健康~
    求最长子串,然后碰到公共字母就输出公共字母,
没碰到的话,先输a还是先输b都行。


                                         2012-07-11
*/








#include"stdio.h"
#include"string.h"


int dp[111][111];
int pre[111][111];
char str1[111],str2[111];


void P(int i,int l)
{
	if(i==0&&l==0)	return ;
	if(pre[i][l]==1)		{P(i,l-1);printf("%c",str2[l]);}
	else if(pre[i][l]==3)	{P(i-1,l);printf("%c",str1[i]);}
	else 					{P(i-1,l-1);printf("%c",str1[i]);}
}


int main()
{
	int i,l;
	int len1,len2;


	while(scanf("%s%s",&str1,&str2)!=-1)
	{
		len1=strlen(str1);
		len2=strlen(str2);


		for(l=len1;l>0;l--)	str1[l]=str1[l-1];
		for(l=len2;l>0;l--)	str2[l]=str2[l-1];
		memset(dp,0,sizeof(dp));
		memset(pre,0,sizeof(pre));
		for(l=0;l<=len1;l++)	pre[l][0]=3;
		for(l=0;l<=len2;l++)	pre[0][l]=1;


		for(i=1;i<=len1;i++)
		{
			for(l=1;l<=len2;l++)
			{
				if(str1[i]==str2[l])			{dp[i][l]=dp[i-1][l-1]+1;pre[i][l]=2;}
				else if(dp[i][l-1]>dp[i-1][l])	{dp[i][l]=dp[i][l-1];pre[i][l]=1;}
				else							{dp[i][l]=dp[i-1][l];pre[i][l]=3;}
			}
		}


		P(len1,len2);
		printf("\n");
	}
	return 0;
}


你可能感兴趣的:(hdu1503)