hdu 1503 Advanced Fruits

来源:互联网 发布:3米距离买多大电视知乎 编辑:程序博客网 时间:2024/05/21 06:31

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1503

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

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;char s1[105],s2[105];int dp[105][105],vis[105][105];int len1,len2;void LCS(){    int i,j;    for(i=0;i<=len1;i++)        vis[i][0]=2;    for(i=0;i<=len2;i++)        vis[0][i]=3;    for(i=1;i<=len1;i++)    {        for(j=1;j<=len2;j++)        {            if(s1[i-1]==s2[j-1])            {                dp[i][j]=dp[i-1][j-1]+1;                vis[i][j]=1;            }            else if(dp[i-1][j]>dp[i][j-1])            {                dp[i][j]=dp[i-1][j];                vis[i][j]=2;            }            else            {                dp[i][j]=dp[i][j-1];                vis[i][j]=3;            }        }    }}void Pri(int x,int y){    if(x==0&&y==0)        return;    if(vis[x][y]==1)    {        Pri(x-1,y-1);        printf("%c",s1[x-1]);    }    else if(vis[x][y]==2)    {        Pri(x-1,y);        printf("%c",s1[x-1]);    }    else    {        Pri(x,y-1);        printf("%c",s2[y-1]);    }}int main(){    while(scanf("%s%s",s1,s2)!=EOF)    {        for(int i=0;i<105;i++)            dp[i][0]=dp[0][i]=0;        len1=strlen(s1),len2=strlen(s2);        LCS();        Pri(len1,len2);        printf("\n");    }    return 0;}

0 0