动态规划求两个序列的最长公共子序列

1、序列str1和序列str2
 
  ·长度分别为m和n;
  ·创建1个二维数组L[m.n];
    ·初始化L数组内容为0
    ·m和n分别从0开始,m++,n++循环:
       - 如果str1[m] == str2[n],则L[m,n] = L[m - 1, n -1] + 1;
       - 如果str1[m] != str2[n],则L[m,n] = max{L[m,n - 1],L[m - 1, n]}
    ·最后从L[m,n]中的数字一定是最大的,且这个数字就是最长公共子序列的长度
    ·从数组L中找出一个最长的公共子序列
 
   2、从数组L中查找一个最长的公共子序列
 
   i和j分别从m,n开始,递减循环直到i = 0,j = 0。其中,m和n分别为两个串的长度。
  ·如果str1[i] == str2[j],则将str[i]字符插入到子序列内,i--,j--;
  ·如果str1[i] != str[j],则比较L[i,j-1]与L[i-1,j],L[i,j-1]大,则j--,否则i--;(如果相等,则任选一个)
 
 
 
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <string>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     string str1,str2;
10     int length1,length2;
11     //int** arr;
12     const int row=300;
13     const int col=300;
14     int arr[row][col];
15     while (cin >> str1 >> str2)
16     {
17         length1 = str1.length(); 
18         length2 = str2.length();
19 
20         //cout << str1 << endl << str2 <<endl;
21         /*arr = new int*[length1+1];
22         for (int i=0;i<length1+1;i++)
23         {
24             arr[i]=new int[length2+1];
25         }*/
26 
27         memset(arr,0,sizeof(arr));
28         for (int i=1;i<=length1;i++)
29         {
30             for (int j=1;j<=length2;j++)
31             {
32                 if (str1[i-1] == str2[j-1])//这里为什么要用i-1,j-1,因为str中的下标从0开始
33                 {
34                     arr[i][j]=arr[i-1][j-1]+1;
35                 }
36                 else
37                 {
38                     arr[i][j]=(arr[i-1][j] > arr[i][j-1]?arr[i-1][j]:arr[i][j-1]);
39                 }
40             }
41         }
42         cout << arr[length1][length2]<<endl;
43 
44         //打印其中一个最长子序列
45         string print="";
46         for (int i=length1,j=length2;i>=1&&j>=1;)//这里是倒序打印的
47         {
48             if (str1[i-1] == str2[j-1])
49             {
50                 //cout << str1[i-1]<<" ";//按照这样会倒序打印
51                 print = str1[i-1]+print;
52                 i--;
53                 j--;
54             }else
55             {
56                 if(arr[i][j -1] >= arr[i - 1][j])j--;
57                 else
58                     i--;
59 
60             }
61             
62         }
63         cout << print <<endl;
64     }
65 
66     return 0;
67 }
 
原文地址:https://www.cnblogs.com/LCCRNblog/p/4321398.html