#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
class Solution{
public:
int getLCSLen(string& s1,string& s2){
_tmp.resize(s1.length());
for(int i=0;i<s1.length();++i){
_tmp[i].resize(s2.length());
}
for(int i=0;i<_tmp.size();++i){
for(int j=0;j<_tmp[i].size();++j){
_tmp[i][j]=-1;
}
}
return getLCSLenInternal(s1,0,s2,0);
}
private:
int getLCSLenInternal(string& s1,int beg1,string& s2,int beg2){
if(beg1>=(int)s1.size()||beg2>=(int)s2.size()){
return 0;
}
if(_tmp[beg1][beg2]!=-1){
return _tmp[beg1][beg2];
}
int len=0;
if(s1[beg1]==s2[beg2]){
len= 1+getLCSLenInternal(s1,beg1+1,s2,beg2+1);
}else{
len= max(getLCSLenInternal(s1,beg1,s2,beg2+1),getLCSLenInternal(s1,beg1+1,s2,beg2));
}
_tmp[beg1][beg2]=len;
return len;
}
private:
vector<vector<int> > _tmp;
};
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
Solution s;
string s1,s2;
getline(cin,s1);
getline(cin,s2);
int ret=s.getLCSLen(s1,s2);
cout<<ret<<endl;
return 0;
}
分析:
备忘录法的经典应用