给出两个字符串,求出他们最大的 Common Subsequence。所谓字符串A的 subsequence,就是A所含的字符的一部分或者全部组成的字符串,并且字符的顺序和A中出现的顺序相同。
用f [ i ][ j ]表示处理到字符串A的第 i 位 和 字符串B第 j 位时的最大值。
f [ i ][ j ] = f[ i - 1 ][ j - 1 ] + 1 (A[ i ] == B[ j ])
f [ i ][ j ] = max( f[ i - 1 ][ j ], f [ i ][ j - 1] ) (A[ i ] != B[ j ])
#include<string>
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int dp[4000][4000];
int main(){
string s1, s2;
while(cin >> s1 >> s2){
for(int i = 1; i <= s1.size(); i++)
for(int j = 1; j <= s2.size(); j++){
if(s1[i - 1] == s2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
}
printf("%d\n", dp[s1.size()][s2.size()]);
}
}