用动态规划求最长公共子序列,要求使用c语言
时间: 2024-11-06 21:15:08 浏览: 37
算法设计与分析实验报告-动态规划寻找最长公共子序列.doc
5星 · 资源好评率100%
动态规划通常用于解决最优化问题,比如寻找最长公共子序列(Longest Common Subsequence, LCS)。在C语言中,我们可以使用二维数组来记录中间状态并逐步计算。以下是基本的思路和伪代码:
```cpp
#include <stdio.h>
// 动态规划函数,lcs[i][j] 表示两个字符串 s1[0..i-1] 和 s2[0..j-1] 的最长公共子序列长度
int lcs(char* s1, char* s2, int m, int n) {
// 初始化二维数组,如果其中一个字符串为空,则返回另一个的长度
int dp[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
dp[i][0] = i;
}
for (int j = 0; j <= n; j++) {
dp[0][j] = j;
}
// 从第二个字符开始遍历,填充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]); // 取较大值
}
}
}
// 最终结果位于dp[m][n]
return dp[m][n];
}
// 测试函数
int main() {
char s1[] = "ABCBDAB";
char s2[] = "BDCAB";
int m = strlen(s1);
int n = strlen(s2);
printf("Length of LCS is %d\n", lcs(s1, s2, m, n));
return 0;
}
```
在这个例子中,`lcs` 函数会返回字符串 `s1` 和 `s2` 的最长公共子序列的长度。注意,实际应用中可能需要另外编写一个辅助函数来获取最长公共子序列的具体字符。
阅读全文