最长公共子序列变形(hdu1503)

给你两个字符串组成一个字符串,在组成的字符串中字符的相对顺序不变的情况下,可以在组成的字符串中找到原先两个字符串...
字母可以错开,但是相对顺序不能变化,要这个组成的字符串中字母数最少..
思路:先求出最长公共子序列,同时记录下路径,记录路径!输出时最长公共子序列的字符只输出一次
这类字符串的题先存一下,估计以后会忘..

include <stdio.h>

include <string.h>

include

using namespace std;

define long long ll

char a[110],b[110],c[210];
int dp[110][110];
struct node
{
int x,y;
char ch;
}ans[210];
int main()
{
while(cin>>a>>b)
{
int i,j;
int l1=strlen(a),l2=strlen(b);
memset(dp,0,sizeof(dp));
for (i=1;i<=l1;i++)
for (j=1;j<=l2;j++)
if (a[i-1]b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if (dp[l1][l2]
0)
{
cout<<a<<b<<endl;
continue;
}
while(p>=0&&q>=0)
{
if (dp[p+1][q+1]dp[p][q]+1&&a[p]b[q])
{
ans[k].x=p,ans[k].y=q;
ans[k++].ch =a[p];
p--,q--;

		}
		else if (dp[p][q+1]>dp[p+1][q])
		p--;
		else
		q--;
	}
	int x=0,y=0;
	for (i=k-1;i>=0;i--)
	{
		while(x!=ans[i].x)
		cout<<a[x],x++;
		while(y!=ans[i].y)
		cout<<b[y],y++;
		cout<<ans[i].ch;
		x++,y++;
	}
cout<<a+ans[0].x<<b+ans[0].y<<endl;	
}
return 0;

}

上一篇:2020安全生产月宣教用品


下一篇:Vue框架2.x的初尝试(二)动态绑定,响应式数据,事件修饰符,(含小练习)