这题在做一遍的确是有了点收获。
这一次没有参考别人代码。自己写的, 不过不完全, 第一次交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; } //不完全是自己写的。