• 最长公共子序列


    假设求Xi和Yi的最长公共子序列,设c[i][j]表示它俩最长公共子序列的长度。

                                   0                          i=0或j=0

    c[i][j]=             c[i-1][j-1]+1                  i,j>0且Xi=Yi       

                       max{c[i][j-1],c[i-1][j]}       i,j>0且Xi !=Yi

    #include <iostream>
    using namespace std;
    char x[1005],y[1005];
    int b[1005][1005];
    int c[1005][1005];
    void LSClength(int m,int n){
        int i,j;
        for(i=1;i<=m;i++)
            for(j=1;j<=n;j++)
                if(x[i]==y[j]){
                    c[i][j]=c[i-1][j-1]+1;
                    b[i][j]=1;
                }else if(c[i-1][j]>=c[i][j-1]){
                    c[i][j]=c[i-1][j];
                    b[i][j]=3;
                }else
                {
                    c[i][j]=c[i][j-1];
                    b[i][j]=2;
                }
    }
    void LSC(int i,int j){
        if(i==0||j==0)  return;
        if(b[i][j]==1){
            LSC(i-1,j-1);
            cout<<x[i];
        }else if(b[i][j]==2)
            LSC(i,j-1);
        else
            LSC(i-1,j);
        
    }
    int main(){
        memset(c,0,sizeof(c));
        memset(b,0,sizeof(b));
        memset(x,'0',sizeof(x));
        memset(y,'0',sizeof(y));
        while(cin>>x>>y){
            int m=strlen(x);
            int n=strlen(y);
            for(int i=m;i>0;i--)
               x[i]=x[i-1];
            for(int j=n;j>0;j--)
                y[j]=y[j-1];
            LSClength(m,n);
            LSC(m,n);
            
        }
        return 0;
    }
  • 相关阅读:
    TreeView使用集锦
    net 下安装、调试的常见问题与错误及解决方法 [转]
    Oracle中使用同义词
    再推荐两个blog和一首好歌
    一点感慨
    推荐一个blog和一个工具
    买书了
    第一次做饭
    ORA00911错误及解决方法
    C#3.0美文收集
  • 原文地址:https://www.cnblogs.com/wintersong/p/4951184.html
Copyright © 2020-2023  润新知