hdu 1503 Advanced Fruits

来源:互联网 发布:excel数据 access 编辑:程序博客网 时间:2024/05/18 01:41

最长公共子序列

给你2个字符串,找出一个一个最短的字符串,同时包含这2个字符串。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>#define maxn 1100using namespace std;int dp[maxn][maxn];int vis[maxn][maxn];char s1[maxn],s2[maxn];void fact(int i,int j){    if(i<=0&&j<=0)return ;    if(vis[i][j]==1)    {        fact(i-1,j-1);        printf("%c",s1[i-1]);    }    else if(vis[i][j]==2)//左    {        fact(i,j-1);        printf("%c",s2[j-1]);    }    else//上    {        fact(i-1,j);        printf("%c",s1[i-1]);    }}int main(){    while(scanf("%s%s",s1,s2)!=EOF)    {        int len1=strlen(s1);        int len2=strlen(s2);        memset(dp,0,sizeof(dp));        for(int i=1; i<=len1; i++)        {            for(int 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][j-1]>=dp[i-1][j])                {                    dp[i][j]=dp[i][j-1];                    vis[i][j]=2;//左                }                else                {                    dp[i][j]=dp[i-1][j];                    vis[i][j]=3;//上                }            }        }        for(int i=0; i<=len1; i++)            vis[0][i]=2;        for(int i=0; i<=len1; i++)            vis[i][0]=3;        fact(len1,len2);        printf("\n");    }    return 0;}


0 0
原创粉丝点击