用C++,DP法求ABCDE和ACDFE的最长公共子序列,分别打印其最值和这个最长公共子序列
时间: 2024-11-06 21:24:14 浏览: 4
在C++中,可以使用动态规划(Dynamic Programming, DP)算法来解决最长公共子序列(Longest Common Subsequence, LCS)问题。对于两个字符串"ABCDE"和"ACDFE",我们首先创建一个二维数组`dp`,其中`dp[i][j]`表示前i个字符组成的子串和前j个字符组成的子串的最长公共子序列长度。
```cpp
#include <iostream>
#include <vector>
std::string lcs(std::string s1, std::string s2) {
int m = s1.size();
int n = s2.size();
std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (s1[i - 1] == s2[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]);
}
}
}
// 根据dp数组构建LCS
std::string result;
int i = m, j = n;
while (i > 0 && j > 0) {
if (s1[i - 1] == s2[j - 1]) {
result = s1[i - 1] + result;
i--;
j--;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
} else {
j--;
}
}
return result;
}
int main() {
std::string str1 = "ABCDE";
std::string str2 = "ACDFE";
int lcsLength = lcs(str1, str2);
std::cout << "Longest common subsequence length: " << lcsLength << std::endl;
std::cout << "Longest common subsequence: " << lcs(str1, str2) << std::endl;
return 0;
}
```
在这个例子中,程序首先计算出最长公共子序列的长度,然后通过回溯dp数组找到实际的子序列。运行这段代码,你会得到最长公共子序列和它的长度。
阅读全文