编写c++程序实现: 1、输入两个字符序列X和Y,设计状态转移方程,输出用于存储最长公共子序列长度的动态规划数组; 2、用动态规划法实现最长公共子序列的求解过程,输出最长公共子序列长度及字符,并分析算法复杂度。
时间: 2024-05-01 15:22:55 浏览: 253
最长公共子序列问题c++实现(动态规划)
1. 以下是实现最长公共子序列长度的动态规划数组的 C++ 代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
int max(int a, int b) {
return a > b ? a : b;
}
int lcsLength(char X[], char Y[], int m, int n) {
int dp[m + 1][n + 1];
memset(dp, 0, sizeof(dp));
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] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
}
int main() {
char X[] = "AGGTAB";
char Y[] = "GXTXAYB";
int m = strlen(X);
int n = strlen(Y);
int lcs_len = lcsLength(X, Y, m, n);
cout << "The length of LCS is " << lcs_len << endl;
return 0;
}
```
2. 以下是 C++ 实现最长公共子序列的代码,同时计算时间复杂度为 O(mn)。
```c++
#include <iostream>
#include <cstring>
using namespace std;
int max(int a, int b) {
return a > b ? a : b;
}
int lcsLength(char X[], char Y[], int m, int n) {
int dp[m + 1][n + 1];
memset(dp, 0, sizeof(dp));
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] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
}
void lcs(char X[], char Y[], int m, int n) {
int dp[m + 1][n + 1];
memset(dp, 0, sizeof(dp));
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] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
int index = dp[m][n];
char lcs[index + 1];
lcs[index] = '\0';
int i = m, j = n;
while (i > 0 && j > 0) {
if (X[i - 1] == Y[j - 1]) {
lcs[index - 1] = X[i - 1];
i--;
j--;
index--;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
} else {
j--;
}
}
cout << "The length of LCS is " << dp[m][n] << endl;
cout << "The LCS is " << lcs << endl;
}
int main() {
char X[] = "AGGTAB";
char Y[] = "GXTXAYB";
int m = strlen(X);
int n = strlen(Y);
lcs(X, Y, m, n);
return 0;
}
```
时间复杂度为 O(mn),其中 m 和 n 分别为两个字符串的长度。
阅读全文