用C语言写最长公共子序列问题:给定两个序列X={x1,X2..}和Y={Y1,Y2...},找出X和Y的最长公共子序列
时间: 2024-02-24 09:56:20 浏览: 95
以下是用C语言实现的最长公共子序列问题的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 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_LENGTH][MAX_LENGTH]) {
if (m == 0 || n == 0) {
return 0;
}
if (dp[m-1][n-1] != -1) {
return dp[m-1][n-1];
}
if (X[m-1] == Y[n-1]) {
dp[m-1][n-1] = 1 + lcs(X, Y, m-1, n-1, dp);
return dp[m-1][n-1];
} else {
dp[m-1][n-1] = max(lcs(X, Y, m, n-1, dp), lcs(X, Y, m-1, n, dp));
return dp[m-1][n-1];
}
}
int main() {
char X[MAX_LENGTH], Y[MAX_LENGTH];
int dp[MAX_LENGTH][MAX_LENGTH];
printf("Enter the first sequence: ");
scanf("%s", X);
printf("Enter the second sequence: ");
scanf("%s", Y);
int m = strlen(X);
int n = strlen(Y);
memset(dp, -1, sizeof(dp));
int length = lcs(X, Y, m, n, dp);
printf("The length of the longest common subsequence is %d.\n", length);
return 0;
}
```
首先定义了一个 `max` 函数,用来返回两个整数中的最大值。
然后定义了 `lcs` 函数,用动态规划的方法来求解最长公共子序列。 `dp` 数组保存了已经计算过的子问题的解,避免了重复的计算。
最后在 `main` 函数中,读入两个序列,初始化 `dp` 数组,调用 `lcs` 函数求解最长公共子序列,并输出结果。
注意,本代码只求解了最长公共子序列的长度,如果需要输出具体的最长公共子序列,还需要对 `dp` 数组进行一些修改。
阅读全文