最长公共子序列
算法思想
代码
#include<iostream> #include<string> #include<cstring> using namespace std; const int maxn=1002; int dp[maxn][maxn],c[maxn][maxn]; string a,b; void LCS() { for(int i=1;i<=a.length();i++) { for(int j=1;j<=b.length();j++) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; c[i][j]=1; } else if(dp[i][j-1]>=dp[i-1][j]) { dp[i][j]=dp[i][j-1]; c[i][j]=2; } else { dp[i][j]=dp[i-1][j]; c[i][j]=3; } } } } void print(int i,int j) { if(i==0||j==0) return; if(c[i][j]==1) { print(i-1,j-1); cout<<a[i-1]; } else if(c[i][j]==2) print(i,j-1); else print(i-1,j); } int main() { cin>>a>>b; memset(dp,0,sizeof(dp)); LCS(); cout<<"最长公共子序列长度:"<<dp[a.length()][b.length()]<<endl; cout<<"最长公共子序列为:"; print(a.length(),b.length()); return 0; }