最长公共子序列(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 }
最长公共子序列
原文地址:https://www.cnblogs.com/125418a/p/12578835.html