最长公共子序列(LCS)求解
1.包含头文件
#include<iostream>
#include<cstring>
2.定义全局变量
char a[200] = "ADABBD"; // 第一个字符串
char b[200] = "BDCDA"; // 第二个字符串
char f[201][201]; // 存储子问题的解:LCS长度
char p[201][201]; // 存储路径信息:1-左上,2-左,3-上
int m, n; // 两个字符串的长度
3.LCS 函数:动态规划求解
void LCS() {
int i, j;
m = strlen(a);
n = strlen(b);
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
if (a[i-1] == b[j-1]) {
f[i][j] = f[i-1][j-1] + 1;
p[i][j] = 1; // 左上方向
} else if (f[i][j-1] > f[i-1][j]) {
f[i][j] = f[i][j-1];
p[i][j] = 2; // 左方向
} else {
f[i][j] = f[i-1][j];
p[i][j] = 3; // 上方向
}
}
}
}
4.getLCS 函数:路径回溯
void getLCS() {
int i, j, k;
char s[200];
i = m; j = n; k = f[m][n];
s[k] = '\0'; // 字符串结束符
while (i > 0 && j > 0) {
if (p[i][j] == 1) {
s[--k] = a[i-1];
i--; j--;
} else if (p[i][j] == 2) {
j--;
} else {
i--;
}
}
for (i = 0; i <= k; i++) {
printf("%c", s[i]);
}
}
5.主函数
int main() {
LCS(); // 计算LCS长度并填充f和p数组
printf("%d\n", f[m][n]); // 输出LCS长度
getLCS(); // 输出LCS
return 0;
}
总结
• 通过动态规划方法,构建了一个二维数组f来存储子问题的解,同时使用p数组记录路径信息。
• 利用p数组进行路径回溯,从f[m][n]开始,逐步构建出最长公共子序列。
• 这种方法有效地解决了最长公共子序列问题,是动态规划和路径回溯的经典应用。
29万+

被折叠的 条评论
为什么被折叠?



