您的位置:首页 > 产品设计 > UI/UE

hdu1503 -Advanced Fruits

2016-07-12 19:23 507 查看
1.hdu  1503

题意:给你两个字符串,要你用这两个字符串组成这样一个字符串,在组成的字符串中字符的相对顺序不变的情况下,可以在组成的字符串中找到原先两个字符串,字母可以错开,但是相对顺序不能变化,要这个组成的字符串中字母数最少,并输出这个字符串。

[align=left]Sample Input[/align]

apple peach

ananas banana

pear peach

 
[align=left]Sample Output[/align]
appleach

bananas

pearch

思路:这是一道最长公共子序列的题目,记录路径,递归输出。

代码:
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;

char st[120],st2[120];

int dp[120][120];
int pos[120][120];

void print(int l,int r)
{
if(l!=0 || r!=0)
{
if(pos[l][r]==3)
{
print(l-1,r-1);
printf("%c",st[l]);
}
else if(pos[l][r]==1)
{
print(l,r-1);
printf("%c",st2[r]);
}
else if(pos[l][r]==2)
{
print(l-1,r);
printf("%c",st[l]);
}

}

return;
}

int main()
{
while(scanf("%s%s",st+1,st2+1)!=EOF)
{
int len = strlen(st+1),len2 = strlen(st2+1);
st[0]='#',st2[0]='$';

for(int i=0; i<=len ; i++) {dp[i][0]=i;pos[i][0]=2;}
for(int j =1; j <=len2; j++) {dp[0][j]=j;pos[0][j]=1;}
dp[0][0]=0;

for(int i=1; i<=len ; i++)
for(int j =1; j <=len2; j++)
{
if(st[i] == st2[j])
{
dp[i][j] = dp[i-1][j-1] +1;
pos[i][j]=3;
}
else
{
if(dp[i][j-1] < dp[i-1][j])
{
dp[i][j] = dp[i][j-1] +1;
pos[i][j]=1;
}else  if(dp[i][j-1] >= dp[i-1][j])
{
dp[i][j] = dp[i-1][j] +1;
pos[i][j]=2;
}
}
}

//print();
print(len,len2);
printf("\n");
// printf("%d%d %d\n",len,len2,dp[len][len2]);
}
return 0;
}
</cstring></cmath></algorithm></cstdio>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: