LCS
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2;
int LCS(string a,string b){
int dp[maxn][maxn]={0};
int alen = a.size(),blen = b.size();
for(int i=1;i<=alen;i++)
for(int j=1;j<=alen;j++)
if(a[i-1]==b[j-1])dp[i][j]=1+dp[i-1][j-1];
else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
return dp[alen][blen];
}
int main(){
string a ="programming",b="contest";
cout<<LCS(a,b)<<endl;
}
LCS+滚动数组
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e2;
int LCS(string a,string b){
int dp[2][maxn]={0};
int alen = a.size(),blen=b.size(),z=0;
for(int i=1;i<=alen;i++){
for(int j=1;j<=blen;j++){
if(a[i-1]==b[j-1])dp[z][j]=dp[z^1][j-1]+1;
else dp[z][j]=max(dp[z^1][j],dp[z][j-1]);
}
z^=1;
}
return dp[z^1][blen];
}
int main(){
string a,b;
while(cin>>a>>b)
cout<<LCS(a,b)<<endl;
}
LCS 最长字串输出
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2;
string LCS(string a,string b){
int dp[maxn][maxn]={0};
int alen = a.size(),blen=b.size();
for(int i=1;i<=alen;i++){
for(int j=1;j<=blen;j++)if(a[i-1]==b[j-1])dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
string t ="";
int i = alen,j=blen;
while(dp[i][j]){
if(dp[i][j]==dp[i-1][j])i--;
else if(dp[i][j]==dp[i][j-1])j--;
else if(dp[i][j]>dp[i-1][j-1])i--,j--,t=a[i]+t;
}
return t;
}
int main(){
string a,b;
while(cin>>a>>b)
cout<<LCS(a,b)<<endl;
}