您的位置:首页 > 其它

hdu 1503 最长公共子序列

2014-11-20 00:14 239 查看
/*
给两个串a,b。输出一个最短的串(含等于a的子序列且含等于b的子序列)
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn=105;
int dp[maxn][maxn],path[maxn][maxn];
int len,len1,len2;
char text[maxn],a[maxn],b[maxn];

void getpath()
{
int n=len,i=len1,j=len2;
while(n)
{
if(path[i][j]==0)
text[n--]=a[i],i--,j--;
else if(path[i][j]==1) i--;
else j--;
}
}

int main()
{
int i,j,k;
a[0]=b[0]='0';
while(~scanf("%s%s",a+1,b+1))
{
memset(dp,0,sizeof(dp));
len1=strlen(a)-1,len2=strlen(b)-1;
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1,path[i][j]=0;
else
{
if(dp[i-1][j]>dp[i][j-1]) dp[i][j]=dp[i-1][j],path[i][j]=1;
else dp[i][j]=dp[i][j-1],path[i][j]=2;
}
}
}
len=dp[len1][len2];
getpath();
j=1,k=1;
for(i=1;i<=len;i++)
{
while(a[j]!=text[i]) printf("%c",a[j++]);
while(b[k]!=text[i]) printf("%c",b[k++]);
printf("%c",text[i]);
j++;k++;
}
while(j<=len1) printf("%c",a[j++]);
while(k<=len2) printf("%c",b[k++]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: