计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y): • 以序列X=<x1 , x2 , …, xm>和Y=<y1 , y2 , …, yn>作为输入。 • 输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储Xi与Yj的最长 公共子序列的长度,b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到 的,这在构造最长公共子序列时要用到。 • X和Y的最长公共子序列的长度记录于c[m,n]中。c实现
时间: 2024-03-05 14:47:28 浏览: 58
好的,下面是C代码实现:
```
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
void LCS_LENGTH(char X[], char Y[], int m, int n, int c[][MAX_LEN+1], int b[][MAX_LEN+1]) {
int i, j;
for (i = 0; i <= m; i++) {
c[i][0] = 0;
}
for (j = 0; j <= n; j++) {
c[0][j] = 0;
}
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
if (X[i-1] == Y[j-1]) {
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1; // 1表示从左上方转移过来
} else if (c[i-1][j] >= c[i][j-1]) {
c[i][j] = c[i-1][j];
b[i][j] = 2; // 2表示从上方转移过来
} else {
c[i][j] = c[i][j-1];
b[i][j] = 3; // 3表示从左边转移过来
}
}
}
}
void print_LCS(char X[], int b[][MAX_LEN+1], int i, int j) {
if (i == 0 || j == 0) {
return;
}
if (b[i][j] == 1) {
print_LCS(X, b, i-1, j-1);
printf("%c", X[i-1]);
} else if (b[i][j] == 2) {
print_LCS(X, b, i-1, j);
} else {
print_LCS(X, b, i, j-1);
}
}
int main() {
char X[MAX_LEN+1], Y[MAX_LEN+1];
int c[MAX_LEN+1][MAX_LEN+1], b[MAX_LEN+1][MAX_LEN+1];
scanf("%s%s", X, Y);
int m = strlen(X);
int n = strlen(Y);
LCS_LENGTH(X, Y, m, n, c, b);
printf("The length of LCS is %d\n", c[m][n]);
printf("LCS is ");
print_LCS(X, b, m, n);
printf("\n");
return 0;
}
```
这个算法的实现和Python版本的类似,只是用了二维数组来保存c和b。在C语言中,二维数组的大小必须在编译时确定,因此我们需要提前定义一个常量MAX_LEN来表示序列的最大长度。
由于C语言没有内置的字符串类型,因此我们需要使用字符数组来表示输入的序列X和Y。在print_LCS函数中,我们使用递归的方式构造最长公共子序列。
阅读全文