思路:
- LCS,之前做过总结了。
- 可以看出滚动数组对时空均有明显优化。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int maxn = 1e3 + 5;
int dp[maxn][maxn];
int main(){
string l,r;
while(cin>>l>>r){
memset(dp , 0 , sizeof(dp));
for(int i=0;i<l.length();i++){
for(int j=0;j<r.length();j++){
if(l[i] == r[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]);
}
}
cout<<dp[l.length()][r.length()]<<endl;
}
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int maxn = 1e3 + 5;
int dp[2][maxn];
int main(){
string l,r;
while(cin>>l>>r){
memset(dp , 0 , sizeof(dp));
int t = 0;
for(int i=0;i<l.length();i++){
t = 1-t;
for(int j=0;j<r.length();j++){
if(l[i] == r[j])
dp[t][j + 1] = dp[1-t][j] + 1;
else
dp[t][j + 1] = max(dp[1-t][j + 1] , dp[t][j]);
}
}
if(l.length() % 2)
cout<<dp[1][r.length()]<<endl;
else
cout<<dp[0][r.length()]<<endl;
}
return 0;
}