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

      对于一个字符串而言:

      字串是指在该字符串中取出连续的一块

      子序列是指在该字符串中删去若干元素后得到的序列

      给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子序列是长度最长的子序列。

      LCS问题:给定两个序列X和Y,找出X和Y的一个最长公共子序列。

    一:当Xi=Yj时,找出Xi-1=Yj-1的最长公共子序列,然后在其尾部加上Xi即可得到X和Y的最长公共子序列。

    二:当Xi≠Yj时,

      1.找到Xi-1和Yj的最长公共子序列。

      2.找到Xi和Yj-1的最长公共子序列。

      3.取两者最大值。

    练习:hdu1159:http://acm.hdu.edu.cn/showproblem.php?pid=1159

    代码如下:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 string str1;
     4 string str2;
     5 int dp[1005][1005];
     6 int main(int argc, char const *argv[])
     7 {
     8     while(cin>>str1>>str2)
     9     {
    10         memset(dp,0,sizeof(dp));
    11         for (int i = 1; i <= str1.length(); ++i)
    12         {
    13             for (int j = 1; j <= str2.length(); ++j)
    14             {
    15                 if (str1[i-1]==str2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
    16                 else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
    17             }
    18         }
    19         cout<<dp[str1.length()][str2.length()]<<endl;
    20     }
    21     return 0;
    22 }
    最长公共子序列
  • 相关阅读:
    表变量与临时表
    表单提交原理
    C_Free引用链接库
    禁用ViewState(转)
    jquery设置元素的readonly和disabled
    WebService经验分享
    如何给GridView添加滚动条 收藏
    bcp+Sql语句抽取数据导出
    List<T>的排序
    AppDomain与动态加载程序集
  • 原文地址:https://www.cnblogs.com/125418a/p/12578835.html
Copyright © 2011-2022 走看看