/* Name: poj 1458 Common Subsequence Author: Unimen Date: 10/05/2011 19:18 Description: DP 最长公共子序列 */ /* 解题报告: 转移方程: dp(i,j) = dp(i-1, j-1)+1 i==j max(dp(i-1,j), dp(i, j-1)) i!=j */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char a[1000], b[1000]; int num[1000][1000]; int main() { int i, j; while(scanf("%s%s", a+1, b+1) != EOF) { for(i=0; i<=strlen(a+1); ++i) { num[i][0] = 0; } for(i=0; i<=strlen(b+1); ++i) { num[0][i] = 0; } for(i=1; i<=strlen(a+1); ++i) { for(j=1; j<=strlen(b+1); ++j) { if(a[i] == b[j]) { num[i][j] = num[i-1][j-1] + 1; } if(a[i] != b[j]) { num[i][j] = max(num[i-1][j], num[i][j-1]); } } } cout<<num[strlen(a+1)][strlen(b+1)]<<endl; } return 0; }