1、最长公共子序列 设:a[0:n-1]和b[0:m-1]是两个字符串数组,由’abcdef’中的字符组成, a[]=”acdfecdfbb”; b[]=”bcdfaedfbc” 1)请实现找a,b的最长公共子序列算法。用C语言动态规划算法来解决这个问题
时间: 2023-06-07 12:08:04 浏览: 96
Sure, 我可以回答您的问题。以下是C语言动态规划算法来解决a和b的最长公共子序列的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int main() {
char a[] = "acdfecdfbb";
char b[] = "bcdfaedfbc";
int n = strlen(a);
int m = strlen(b);
int dp[n+1][m+1];
// 初始化DP表格
memset(dp, 0, sizeof(dp));
// 动态规划计算每个子问题的解
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i-1] == b[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 lcs_length = dp[n][m];
char lcs[lcs_length+1];
int i = n, j = m, index = lcs_length;
while (i > 0 && j > 0) {
if (a[i-1] == b[j-1]) {
lcs[index-1] = a[i-1];
i--;
j--;
index--;
} else if (dp[i-1][j] > dp[i][j-1]) {
i--;
} else {
j--;
}
}
printf("最长公共子序列为:%s\n", lcs);
return 0;
}
```
希望这个代码可以对您有所帮助。
阅读全文