标签:变形 int 字符串 110 ans 序列 -- dp 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;
}
标签:变形,int,字符串,110,ans,序列,--,dp,hdu1503 来源: https://www.cnblogs.com/shidianshixuan/p/13738613.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。