求最长公共子序列,比较出两个字符串的最长的序列。
用动态规划求解
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 }