链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159
题解
#include<iostream> #include<cstring> using namespace std; char A[1005],B[1005]; //存放字符串 int dp[1005][1005]; //存放到字符串a第 i+1个字符,字符串b第 j+1个字符为止的最大长度公共子序列的长度 int main(){ while(~scanf("%s%s",A,B)){ int alen=strlen(A),blen=strlen(B); //注意头文件 for(int i=0;i<alen;i++){ for(int j=0;j<blen;j++){ if(A[i]==B[j]) dp[i+1][j+1]=dp[i][j]+1; else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]); } } printf("%d\n",dp[alen][blen]); } return 0; }
定义 dp[ i ][ j ]为 A1...Ai 和 B1...Bj 对应的 LCS(最长公共子序列)长度
那么,A1...Ai+1 和 B1...Bj+1 对应的公共子列可能是
- 当 Ai+1==Bj+1时,在 A1...Ai 和 B1...Bj 的公共子列末尾追加上 Ai+1
- A1...Ai+1 和 B1...Bj 的公共子列
- A1...Ai 和 B1...Bj+1 的公共子列
三者中的一个,则有以下递推关系成立
该递推式时间复杂度O(nm),dp[n][m]就是LCS的长度