动态规划最长公共子序列c语言实现
时间: 2023-11-14 20:12:47 浏览: 113
动态规划最长公共子序列是一种常见的算法,它可以用来解决两个字符串之间的最长公共子序列问题。下面是一个简单的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 *str1, char *str2, int len1, int len2) {
int dp[MAX_LEN][MAX_LEN];
int i, j;
for (i = 0; i <= len1; i++) {
for (j = 0; j <= len2; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
} else if (str1[i - 1] == str2[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[len1][len2];
}
int main() {
char str1[MAX_LEN], str2[MAX_LEN];
int len1, len2;
printf("请输入第一个字符串:");
scanf("%s", str1);
printf("请输入第二个字符串:");
scanf("%s", str2);
len1 = strlen(str1);
len2 = strlen(str2);
printf("最长公共子序列的长度为:%d\n", lcs(str1, str2, len1, len2));
return 0;
}
```
这个实现中,我们使用了一个二维数组dp来记录最长公共子序列的长度。其中dp[i][j]表示str1的前i个字符和str2的前j个字符之间的最长公共子序列长度。我们通过递推的方式来计算dp数组中的每一个元素,最终得到dp[len1][len2]就是最长公共子序列的长度。
阅读全文