最长公共子序列(dp)
求最长公共子序列,比较出两个字符串的最长的序列。
用动态规划求解
1 #include <bits/stdc++.h> 2 #define N 10005 3 #define mem(a) memset(a,0,sizeof(a)) 4 5 using namespace std; 6 int k[N][N]; 7 stack<char> s; 8 void substring(string s1,string s2){ 9 mem(k); 10 int slen,clen; 11 slen=s1.length(); 12 clen=s2.length(); 13 for(int i=1;i<=slen;i++){ 14 for(int j=1;j<=clen;j++){ 15 if(s1[i-1]==s2[j-1]){ 16 k[i][j]=k[i-1][j-1]+1; 17 }else{ 18 k[i][j]=max(k[i][j-1],k[i-1][j]); 19 } 20 } 21 } 22 for(int i=slen,j=clen;i>=1&&j>=1;){ 23 if(s1[i-1]==s2[j-1]){ 24 s.push(s1[i-1]); 25 i--,j--; 26 }else{ 27 if(k[i][j-1]>=k[i-1][j]){ 28 j--; 29 }else{ 30 i--; 31 } 32 } 33 } 34 } 35 36 int main(){ 37 string s1,s2; 38 cin>>s1>>s2; 39 substring(s1,s2); 40 while(!s.empty()){ 41 cout<<s.top(); 42 s.pop(); 43 } 44 cout<<endl; 45 return 0; 46 }