最长公共子序列nlogn c++
时间: 2024-04-08 14:27:28 浏览: 80
lis.rar_lis
最长公共子序列(Longest Common Subsequence,简称LCS)是指在两个序列中找到最长的公共子序列的问题。这里给出一个nlogn的C++实现。
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int longestCommonSubsequence(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size();
int n = nums2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (nums1[i - 1] == nums2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
}
int main() {
vector<int> nums1 = {1, 2, 3, 4, 5};
vector<int> nums2 = {2, 4, 6, 8};
int result = longestCommonSubsequence(nums1, nums2);
cout << "最长公共子序列的长度为:" << result << endl;
return 0;
}
```
上述代码使用动态规划的思想,通过构建一个二维数组dp来记录最长公共子序列的长度。其中dp[i][j]表示nums1前i个元素和nums2前j个元素的最长公共子序列的长度。通过遍历nums1和nums2,根据当前元素是否相等来更新dp数组。最终返回dp[m][n]即为最长公共子序列的长度。
阅读全文