C++1、输入两个字符序列X和Y,设计状态转移方程,输出用于存储最长公共子序列长度的动态规划数组; 2、用动态规划法实现最长公共子序列的求解过程,输出最长公共子序列长度及字符,并分析算法复杂度。
时间: 2024-02-11 20:07:55 浏览: 132
好的,以下是C++实现:
1. 设计状态转移方程,输出用于存储最长公共子序列长度的动态规划数组。
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;
int c[MAXN][MAXN]; // 用于存储最长公共子序列长度的动态规划数组
int main() {
char X[MAXN], Y[MAXN];
cin >> X + 1 >> Y + 1; // 为了方便后面的计算,将X和Y的下标从1开始
int m = strlen(X + 1), n = strlen(Y + 1);
for (int i = 0; i <= m; i++) { // 初始化
c[i][0] = 0;
}
for (int j = 0; j <= n; j++) { // 初始化
c[0][j] = 0;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (X[i] == Y[j]) {
c[i][j] = c[i-1][j-1] + 1;
} else {
c[i][j] = max(c[i][j-1], c[i-1][j]);
}
}
}
// 输出c数组
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cout << c[i][j] << " ";
}
cout << endl;
}
return 0;
}
```
2. 用动态规划法实现最长公共子序列的求解过程,输出最长公共子序列长度及字符,并分析算法复杂度。
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;
int c[MAXN][MAXN]; // 用于存储最长公共子序列长度的动态规划数组
int main() {
char X[MAXN], Y[MAXN];
cin >> X + 1 >> Y + 1; // 为了方便后面的计算,将X和Y的下标从1开始
int m = strlen(X + 1), n = strlen(Y + 1);
for (int i = 0; i <= m; i++) { // 初始化
c[i][0] = 0;
}
for (int j = 0; j <= n; j++) { // 初始化
c[0][j] = 0;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (X[i] == Y[j]) {
c[i][j] = c[i-1][j-1] + 1;
} else {
c[i][j] = max(c[i][j-1], c[i-1][j]);
}
}
}
// 输出最长公共子序列长度
cout << "最长公共子序列长度为:" << c[m][n] << endl;
// 输出最长公共子序列
int len = c[m][n], k = len;
char lcs[MAXN];
while (len > 0) {
if (X[m] == Y[n]) {
lcs[--k] = X[m];
m--;
n--;
len--;
} else if (c[m-1][n] > c[m][n-1]) {
m--;
} else {
n--;
}
}
cout << "最长公共子序列为:" << lcs << endl;
return 0;
}
```
算法的时间复杂度为 $O(mn)$,空间复杂度也为 $O(mn)$。
阅读全文