c语言最长公共子系列动态规划
时间: 2023-10-07 11:04:17 浏览: 84
最长公共子序列(Longest Common Subsequence,简称 LCS)是指两个字符串中的最长公共子序列的长度。而最长公共子序列动态规划算法可以用来解决这个问题。
假设有两个字符串 S1 和 S2,它们的长度分别为 m 和 n。定义一个二维数组 dp[m+1][n+1],其中 dp[i][j] 表示 S1 中前 i 个字符和 S2 中前 j 个字符的最长公共子序列的长度。
那么,如果 S1 的第 i 个字符和 S2 的第 j 个字符相同,那么 dp[i][j] 就等于 dp[i-1][j-1] 加上 1;否则,dp[i][j] 就等于 dp[i-1][j] 和 dp[i][j-1] 中的较大值。
最终,dp[m][n] 就是 S1 和 S2 的最长公共子序列的长度。
下面是 C 语言的代码实现:
```
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return a > b ? a : b;
}
int longest_common_subsequence(char *s1, char *s2) {
int m = strlen(s1);
int n = strlen(s2);
int dp[m+1][n+1];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (s1[i-1] == s2[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 s1[] = "ABCD";
char s2[] = "BD";
int len = longest_common_subsequence(s1, s2);
printf("%d\n", len); // output: 2
return 0;
}
```
阅读全文