最长公共子序列问题。给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},用动态规划算法找出X和Y的最长公共子序列,用C/C++实现该算法。
时间: 2024-05-01 20:20:33 浏览: 66
动态规划求解最长公共子序列的算法如下:
1. 定义一个二维矩阵dp[m+1][n+1],其中dp[i][j]表示X的前i个字符和Y的前j个字符的最长公共子序列的长度。
2. 初始化矩阵dp的第一行和第一列,即dp[i][0]和dp[0][j]均为0,因为一个序列与空序列的最长公共子序列为0。
3. 对于矩阵dp的其他元素dp[i][j],如果Xi==Yj,则dp[i][j]=dp[i-1][j-1]+1,即X的前i-1个字符和Y的前j-1个字符的最长公共子序列长度加上Xi和Yj的长度1。如果Xi!=Yj,则dp[i][j]=max(dp[i-1][j], dp[i][j-1]),即X的前i个字符和Y的前j-1个字符的最长公共子序列长度和X的前i-1个字符和Y的前j个字符的最长公共子序列长度中的较大值。
4. 最终的结果即为dp[m][n]。
下面是C语言实现代码:
```c
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return a > b ? a : b;
}
int lcs(char *X, char *Y, int m, int n) {
int dp[m+1][n+1];
int i, j;
for (i = 0; i <= m; i++)
dp[i][0] = 0;
for (j = 0; j <= n; j++)
dp[0][j] = 0;
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[] = "ABCBDAB";
char Y[] = "BDCABA";
int m = strlen(X);
int n = strlen(Y);
printf("Length of LCS is %d\n", lcs(X, Y, m, n));
return 0;
}
```
输出结果为:
```
Length of LCS is 4
```
即X和Y的最长公共子序列为BCBA。
阅读全文