給定兩字符串,求最長公共子序列長度。多測試用例,字符串長度 ≤ 1000。
c[i][j] 表示 a[0..i-1] 與 b[0..j-1] 的 LCS 長度。a[i-1] == b[j-1]:c[i][j] = c[i-1][j-1] + 1c[i][j] = max(c[i-1][j], c[i][j-1])c[0][*] = c[*][0] = 0。c[m][n](或矩陣中最大值,兩者等價)。#include <iostream> #include <cstring> using namespace std; #define M 1000 #define N 1000 int c[M][N]; int lcs_len(char *a, char *b) { int m = strlen(a), n = strlen(b), i, j; for (i = 0; i <= m; ++i) for (j = 0; j <= n; ++j) c[i][j] = 0; for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { if (a[i-1] == b[j-1]) c[i][j] = c[i-1][j-1] + 1; else if (c[i-1][j] > c[i][j-1]) c[i][j] = c[i-1][j]; else c[i][j] = c[i][j-1]; } } return c[m][n]; } int main() { char a[M], b[M]; while (cin >> a >> b) cout << lcs_len(a, b) << endl; return 0; }
c[m][n] 回溯構造。a[i-1]==b[j-1] ? c[i-1][j-1]+1 : 0。