最长公共子序列模板

来源:互联网 发布:大肚孕照软件下载 编辑:程序博客网 时间:2024/06/05 14:31
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>#include<set>using namespace std;char s1[1000];char s2[1000];int dp[1100][1100];int p[1100][1100];int len1,len2;void solve(){    memset(dp,0,sizeof(dp));    memset(p,0,sizeof(p));    len1=strlen(s1);    len2=strlen(s2);    for(int i=0; i<=len1; i++)        dp[i][0]=0;    for(int j=0; j<=len2; j++)        dp[0][j]=0;    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;                p[i][j]=0;            }            else if(dp[i][j-1]<dp[i-1][j])            {                dp[i][j]=dp[i-1][j];                p[i][j]=1;            }            else            {                dp[i][j]=dp[i][j-1];                p[i][j]=-1;            }        }    }}void output(char *s1,int l1,char *s2,int l2,int p[][1100]){    if(l1==0||l2==0)        return ;    else if(p[l1][l2]==0)    {        output(s1,l1-1,s2,l2-1,p);        cout<<s1[l1-1];    }    else if(p[l1][l2]==1)        output(s1,l1-1,s2,l2,p);    else        output(s1,l1,s2,l2-1,p);}int main(){    while(cin>>s1>>s2)    {        solve();        cout<<dp[len1][len2]<<endl;        output(s1,len1,s2,len2,p);    }    return 0;}


 

原创粉丝点击