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

    两个串a1 a2 a3···an   b1 b2 b3···bm

    这俩的最长公共子序列为c1 c2 c3···ck

    dp[i][j]表示串a长度为i时和串b长度为j时的最长公共子序列的长度

     1、若an == bn,则ck = an,即c1 c2 c3···c(k-1)为a1 a2 a3···a(n-1) 和 b1 b2 b3···b(m-1)的最长公共子序列,同理第i,j个位置,dp[i][j] = dp[i - 1][j - 1] + 1;

    2、若an != bn ,若ck != an,  即c1 c2 c3···c(k-1)为a1 a2 a3···a(n-1) 和 b1 b2 b3···b(m)的最长公共子序列,同理第i,j个位置,dp[i][j] = dp[i - 1][j];

    3、若an != bn ,若ck != bm,  即c1 c2 c3···c(k-1)为a1 a2 a3···an 和 b1 b2 b3···b(m - 1)的最长公共子序列,同理第i,j个位置,dp[i][j] = dp[i][j - 1];

    综上

    if(a[i] == b[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
    else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

    模板题HDU - 1159

    int dp[1010][1010];
    int main()
    {
    
    
        string str1, str2;
        while(cin >> str1 >> str2)
        {
            mem(dp, 0);
            int len1 = str1.size();
            int len2 = str2.size();
            for(int i = 0; i < len1; i++)
                for(int j = 0; j < len2; j++)
                    if(str1[i] == str2[j]) dp[i + 1][j + 1] = dp[i][j] + 1;
                    else dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1]);
            cout << dp[len1][len2] << endl;
        }
    
    
        return 0;
    }
  • 相关阅读:
    域渗透基础(二)
    域渗透基础(一)
    域环境搭建
    java基础(五)-----new一个对象的具体过程
    数据结构(八)-----散列表
    数据结构(七)-----跳表
    数据结构(六)-----队列
    数据结构(五)-----栈
    数据结构(四)-----链表
    数据结构(三)-----数组
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/14266965.html
Copyright © 2011-2022 走看看