动态规划———最长公共子序列 c++完整代码
-
最长公共子序列(LCS)定义:
给定序列s1={1,3,4,5,6,7,7,8}, s2={3,5,7,4,8,6,7,8,2},s1和s2的相同子序列,且该子序列的长度最长,即是LCS。 公共子序列就是,s1和s2中都要包含的元素,并且顺序是保持不变的;其中上述s1和s2一个最长公共子序列是{ 3,4,6,7,8 };
-
递推关系:
二维数组arr[i][j]的元素存放,子串s中,s0s1s2s3……si-1,和子t中,t0t1t2t3……..ti-1这两个子串的LCS长度;
1)当si=tj时——arr[i][j]=arr[i-1]+arr[j-1]+1;
2)当 si≠tj时——arr[i][j]=max(arr[i-1][j],arr[i][j-1]);
-
代码实现
#include<iostream> using namespace std; #include<algorithm> #include<string> #include<vector> int lcs(string s, string t) { int slen = s.size(); int tlen = s.size(); int i = 0, j = 0; //创建二维数组 vector<int> col(slen + 1, 0); vector<vector<int>>arr(tlen + 1, col); for (int i = 1; i <=slen; i++) { //逐行从左往右填写表 for (int j = 1; j <=tlen; j++) { if (s[i-1] == t[j-1]) { arr[i][j] = arr[i - 1][j - 1] + 1; } else { arr[i][j] = (arr[i - 1][j]) > (arr[i][j - 1]) ? arr[i - 1][j] : arr[i][j - 1]; } } } return arr[slen][tlen]; } int main() { string s = "13456778"; string t = "357486782"; int len = lcs(s, t); cout << "最长公共子序列长度为:" << len << endl; //输出为5 return 0; system("pause"); return 0; }
下一篇:
数据结构与算法系列 目录