最长公共子序列问题。给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},用动态规划算法找出X和Y的最长公共子序列,用C/C++实现该算法。
时间: 2024-04-30 22:17:38 浏览: 82
利用动态规划算法解决最长公共子序列问题.doc
最长公共子序列问题可以使用动态规划来解决,具体的思路是定义一个二维数组dp,其中dp[i][j]表示序列X的前i个元素与序列Y的前j个元素的最长公共子序列长度。
根据最长公共子序列的定义,对于序列X的第i个元素和序列Y的第j个元素,有两种情况:
1. 如果xi等于yj,则它们一定在最长公共子序列中,此时dp[i][j]可以通过dp[i-1][j-1]加1得到。
2. 如果xi不等于yj,则它们一定不在最长公共子序列中,此时dp[i][j]可以通过dp[i-1][j]和dp[i][j-1]取最大值得到。
最终,dp[m][n]即为序列X和序列Y的最长公共子序列长度。
下面是C语言实现代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int max(int a, int b) {
return a > b ? a : b;
}
int lcs(char *X, char *Y, int m, int n) {
int dp[MAX_LEN + 1][MAX_LEN + 1];
int i, j;
memset(dp, 0, sizeof(dp));
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
if (X[i - 1] == Y[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
}
int main() {
char X[MAX_LEN + 1], Y[MAX_LEN + 1];
int m, n, len;
printf("Enter sequence X: ");
scanf("%s", X);
printf("Enter sequence Y: ");
scanf("%s", Y);
m = strlen(X);
n = strlen(Y);
len = lcs(X, Y, m, n);
printf("The length of LCS is %d\n", len);
return 0;
}
```
输入样例:
```
Enter sequence X: ABCBDAB
Enter sequence Y: BDCABA
```
输出样例:
```
The length of LCS is 4
```
阅读全文