最长公共子序列问题。给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},用动态规划算法找出X和Y的最长公共子序列,用C/C++实现该算法。
时间: 2024-04-30 09:17:37 浏览: 114
首先,我们需要定义状态转移方程。
设dp[i][j]为X的前i个字符和Y的前j个字符的LCS长度。
当X[i] == Y[j]时,dp[i][j] = dp[i-1][j-1] + 1;
当X[i] != Y[j]时,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
最终的LCS长度即为dp[m][n],其中m为X的长度,n为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 = strlen(X);
int n = strlen(Y);
int dp[MAX_LEN][MAX_LEN];
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[MAX_LEN], Y[MAX_LEN];
printf("请输入两个字符串X和Y:\n");
scanf("%s %s", X, Y);
int res = lcs(X, Y);
printf("X和Y的最长公共子序列长度为:%d\n", res);
return 0;
}
```
输入示例:
```
请输入两个字符串X和Y:
ABCBDAB BDCABA
```
输出示例:
```
X和Y的最长公共子序列长度为:4
```
阅读全文