动态规划 二.最长子序列

问题描述:

给定两个子序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,则称Z时X和Y的公共子序列。

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int const N=81;
 5 
 6 void lcslength(int m,int n,char *x,char *y,int c[][N],int b[][N])
 7 {
 8     int i,j;
 9     for(i=1;i<=m;i++) c[i][0]=0;
10     for(i=1;i<=n;i++) c[0][i]=0;
11     for(i=1;i<=m;i++)
12     for(j=1;j<=n;j++)
13     {
14         if(x[i]==y[j])
15         {
16             c[i][j]=c[i-1][j-1]+1;
17             b[i][j]=1;
18         }
19         else if(c[i-1][j]>c[i][j-1])
20         {
21             c[i][j]=c[i-1][j];
22             b[i][j]=2;
23         }
24         else {
25             c[i][j]=c[i][j-1];
26             b[i][j]=3; 
27         }
28      } 
29  } 
30  
31 void lcs(int i,int j,char *x,int b[][N])
32 {
33     if(i==0||j==0)return;
34     if(b[i][j]==1) 
35     {
36         lcs(i-1,j-1,x,b);
37         cout<<x[i]<<" ";
38     }
39     else if(b[i][j]==2)
40     lcs(i-1,j,x,b);
41     else lcs(i,j-1,x,b);
42 }
43 
44 int main()
45 {
46     char x[N],y[N];
47     int c[N][N],b[N][N];
48     int m,n;
49     cin>>m;
50     for(int i=1;i<=m;i++)
51     cin>>x[i];
52     cin>>n;
53     for(int i=1;i<=n;i++)
54     cin>>y[i];
55     lcslength(m,n,x,y,c,b);
56     lcs(m,n,x,b);
57     return 0;
58 }
原文地址:https://www.cnblogs.com/yuanqingwen/p/12748301.html