用动态规划算法求解最长公共子序列,要求使用.cpp文件,要求不能使用cin,cout
时间: 2024-05-13 16:13:28 浏览: 87
下面是一个使用动态规划算法求解最长公共子序列的示例代码(C++实现):
```
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1000; // 最长序列长度的上限
int dp[MAXN][MAXN]; // 动态规划数组
char s1[MAXN], s2[MAXN]; // 两个字符串
int main() {
// 读入两个字符串
scanf("%s%s", s1, s2);
// 计算两个字符串的长度
int len1 = strlen(s1), len2 = strlen(s2);
// 初始化dp数组
for (int i = 0; i <= len1; i++) {
dp[i][0] = 0;
}
for (int j = 0; j <= len2; j++) {
dp[0][j] = 0;
}
// 动态规划过程
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (s1[i-1] == s2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
// 输出最长公共子序列长度
printf("%d\n", dp[len1][len2]);
// 输出最长公共子序列
int i = len1, j = len2;
char ans[MAXN];
int k = 0;
while (i > 0 && j > 0) {
if (s1[i-1] == s2[j-1]) {
ans[k++] = s1[i-1];
i--;
j--;
} else if (dp[i-1][j] > dp[i][j-1]) {
i--;
} else {
j--;
}
}
for (int l = k-1; l >= 0; l--) {
printf("%c", ans[l]);
}
printf("\n");
return 0;
}
```
该代码使用了一个二维数组dp来记录两个字符串的最长公共子序列的长度。dp[i][j]表示s1的前i个字符和s2的前j个字符的最长公共子序列的长度。动态规划的过程中,如果s1[i-1]等于s2[j-1],则dp[i][j]等于dp[i-1][j-1]加1,否则dp[i][j]等于dp[i-1][j]和dp[i][j-1]的较大值。最后,可以根据dp数组得到最长公共子序列,具体方法是从dp[len1][len2]开始,向左上方追踪,如果s1[i-1]等于s2[j-1],则将其添加到结果字符串中,否则根据dp[i-1][j]和dp[i][j-1]的大小关系来决定向左还是向上移动。
阅读全文