最长公共子序列

来源:互联网 发布:linux 删除匹配文件 编辑:程序博客网 时间:2024/06/06 13:08

问题描述:
给出两个序列Xn和Ym。求出两序列的最长公共子序列。(子序列:下表递增的序列)。
分析:
这里写图片描述
这里写图片描述

#include <iostream>using namespace std;const int MAXN = 1005;int S[MAXN][MAXN],L[MAXN][MAXN];char x[MAXN],y[MAXN],z[MAXN];int CommonOrder(char x[],int n,char y[],int m,char z[]);int main(){    int n,m,i;    cin>>n;    for(i=1;i<=n;i++)        cin>>x[i];    cin>>m;    for(i=1;i<=m;i++)        cin>>y[i];    cout<<"最长公共子序列"<<endl;    cout<<"长度为:"<<CommonOrder(x,n,y,m,z)<<endl;    return 0;}int CommonOrder(char x[],int n,char y[],int m,char z[]){    int i,j,k;    for(i=0;i<=n;i++)        L[i][0]=0;    for(i=0;i<=m;i++)        L[0][i]=0;    for(i=1;i<=n;i++)    {        for(j=1;j<=m;j++)        {            if(x[i] == y[j])            {                L[i][j]=L[i-1][j-1]+1;                S[i][j]=1;            }            else if(L[i][j-1]>L[i-1][j])            {                L[i][j]=L[i][j-1];                S[i][j]=2;            }            else            {                L[i][j]=L[i-1][j];                S[i][j]=3;            }        }    }    i=n;j=m;k=L[n][m];    while(i>0 && j>0)    {        if(S[i][j]==1)        {            z[k--]=x[i];            i--;            j--;        }        else if(S[i][j]==2)            j--;        else i--;    }    for(k=1;k<=L[n][m];k++)        cout<<z[k]<<" ";    cout<<endl;    return L[n][m];}

数据:
输入:
6
a b c b d b
9
a c b b a b d b b
输出:
最长公共子序列:
a b b d b
长度为:5

该算法当有多解时,只是输出了其中的一个解!!!(当输入为上面的时候,其实a c b d b也是最长公共子序列)

1 0
原创粉丝点击