zoukankan      html  css  js  c++  java
  • 最长公共子序列(LCS)

    时限:1000ms 内存限制:200000K  总时限:3000ms

    描述
    一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有:

    Xij = Zj

    如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。
    求A、B所有公共子序列中最长的序列的长度。
     
    输入
    输入共两行,每行一个由字母和数字组成的字符串,代表序列A、B。A、B的长度不超过200个字符。
     
    输出
    一个整数,表示最长各个子序列的长度。
    格式:printf("%d\n");
     
    输入样例
    programming
    contest
     
    输出样例
    2
     
    /*
     * @author  Panoss
     */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<vector>
    #include<ctime>
    #include<stack>
    #include<queue>
    #include<list>
    using namespace std;
    #define DBG 1
    #define fori(i,a,b) for(int i = (a); i < (b); i++)
    #define forie(i,a,b) for(int i = (a); i <= (b); i++)
    #define ford(i,a,b) for(int i = (a); i > (b); i--)
    #define forde(i,a,b) for(int i = (a); i >= (b); i--)
    #define forls(i,a,b,n) for(int i = (a); i != (b); i = n[i])
    #define mset(a,v) memset(a, v, sizeof(a))
    #define mcpy(a,b) memcpy(a, b, sizeof(a))
    #define dout  DBG && cerr << __LINE__ << " >>| "
    #define checkv(x) dout << #x"=" << (x) << " | "<<endl
    #define checka(array,a,b) if(DBG) { \
        dout<<#array"[] | " << endl; \
        forie(i,a,b) cerr <<"["<<i<<"]="<<array[i]<<" |"<<((i-(a)+1)%5?" ":"\n"); \
        if(((b)-(a)+1)%5) cerr<<endl; \
    }
    #define redata(T, x) T x; cin >> x
    #define MIN_LD -2147483648
    #define MAX_LD  2147483647
    #define MIN_LLD -9223372036854775808
    #define MAX_LLD  9223372036854775807
    #define MAX_INF 18446744073709551615
    inline int  reint() { int d; scanf("%d",&d); return d; }
    inline long relong() { long l; scanf("%ld",&l); return l; }
    inline char rechar() { scanf(" "); return getchar(); }
    inline double redouble() { double d; scanf("%lf", &d); return d; }
    inline string restring() { string s; cin>>s; return s; }
    
    int c[205][205];
    /*
    c[i][j]表示从A1...i和B1...j的最长公共子序列长度为c[i][j]
    状态转移方程为
    
    c[i][j] = 0 i=0或j=0;
    c[i][j] = c[i-1][j-1] + 1 Ai = Bj
    c[i][j] = max(c[i-1][j],c[i][j-1]) i,j>0,Ai!=Bi
    */
    char A[205], B[205];
    int A_length, B_length;
    
    void DP()
    {
        mset(c,0);
        A_length = strlen(A);
        B_length = strlen(B);
        forde(i,A_length,1)  //先全部后移一位
            A[i] = A[i-1];
        forde(i,B_length,1)
            B[i] = B[i-1];
    
        forie(i,1,A_length)
        {
            forie(j,1,B_length)
            {
                if(A[i] == B[j])
                {
                    c[i][j] = c[i-1][j-1] + 1;
                }
                else
                {
                    c[i][j] = max(c[i-1][j],c[i][j-1]);
                }
            }
        }
    }
    
    int main()
    {
        //freopen("data.txt","r",stdin);
        scanf("%s",A);
        scanf("%s",B);
        DP();
        cout << c[A_length][B_length] << endl;
        return 0;
    }
  • 相关阅读:
    windows的一组常用运行命令
    nfs:server is not responding,still trying 原因与解决方案
    MYSQL外键(Foreign Key)的使用
    byte[]转字符串编码问题
    /usr/bin/ld: cannot find lGL
    Linux查看用户及分组
    NAND和NOR flash的区别
    Win7+Ubuntu11.10(EasyBCD硬盘安装)
    Win7+Ubuntu12.04.1硬盘安装错误及解决方案
    Linux内核编译时错误
  • 原文地址:https://www.cnblogs.com/Panoss/p/3741929.html
Copyright © 2011-2022 走看看