用时 10min ,一遍过。
设 f[i][j] 表示第一个字符串的前 i 位和第二个字符串的前 j 位最长公共子序列的长度。
当比较的这两个字母相同时,f[i][j] = f[i-1][j-1] + 1 。
否则 f[i][j] = max(f[i-1][j],f[i][j-1]) 。
#include<bits/stdc++.h> using namespace std; char a[1001],b[1001]; int n,m,f[1001][1001]; int main() { scanf("%s%s",a,b); n = strlen(a);m = strlen(b); for(int i = 0;i < n;i ++) { for(int j = 0;j < m;j ++) { if(a[i] == b[j]) f[i][j] = f[i-1][j-1] + 1; else f[i][j] = max(f[i-1][j],f[i][j-1]); } } cout<<f[n-1][m-1]<<endl; return 0; }