用C++写出最长公共子序列问题的算法。要求输入两个序列X,Y,输出X和Y的最长公共子序列。
时间: 2024-10-13 19:13:56 浏览: 25
在C++中,可以使用动态规划(Dynamic Programming)的方法来解决最长公共子序列(Longest Common Subsequence,LCS)问题。经典的Kruskal's Algorithm并不是最适合于此问题的,而是一种名为“二维动态规划”的策略更为合适。
下面是一个简单的C++代码示例:
```cpp
#include <iostream>
#include <vector>
int lcs(std::string X, std::string Y) {
int m = X.size();
int n = Y.size();
// 初始化一个二维动态规划矩阵
std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
// 遍历矩阵,填充dp[i][j]
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (X[i - 1] == Y[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = std::max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
}
int main() {
std::string X = "ABCDGH";
std::string Y = "AEDFHR";
int result = lcs(X, Y);
std::cout << "The length of the longest common subsequence is: " << result << std::endl;
return 0;
}
```
在这个代码中,`dp[i][j]`表示字符串X的前i个字符和字符串Y的前j个字符的最长公共子序列长度。如果X[i-1]和Y[j-1]相等,那么它们本身就是LCS的一部分,所以长度加一;如果不相等,取两者的最大值,即去掉最后一个字符后的LCS长度。
阅读全文