这题在做一遍的确是有了点收获。
这一次没有参考别人代码。自己写的, 不过不完全, 第一次交WA了。
第二次才A掉。
状态方程:如果str1[i] == str2[j] 则dp[i][j] = dp[i-1][j-1] + 1
如果str1[i] != str2[j] 则dp[i][j] = max(dp[i-1][j], dp[i][j-1])
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int dp[1000][1000];
int max1 (int a, int b)
{
return a > b ? a : b;
}
int main()
{
int i, j, m, n;
char str1[1000], str2[1000];
while (scanf("%s %s", str1, str2) != EOF)
{
memset(dp, 0, sizeof(dp));
m = strlen(str1);
n = strlen(str2);
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
{
//比较串1 与 串2字符是否相等
//比较前一字符 so, i, j 初始化为1
//dp[i][j] 记录的是str1的i-1个字符状态和str2的j-1个字符状态
if (str1[i-1] == str2[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max1(dp[i-1][j], dp[i][j-1]);
//printf("i = %d j = %d dp[i][j] = %d\n", i, j, dp[i][j]);
}
printf("%d\n", dp[m][n]);
}
return 0;
}
//不完全是自己写的。

本文介绍了一种解决最长公共子序列问题的动态规划方法,并提供了详细的C语言实现代码。通过对两个字符串进行逐字符对比,利用状态转移方程确定最长公共子序列长度。
442

被折叠的 条评论
为什么被折叠?



