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


    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 }
     
  • 相关阅读:
    Linux之C编译器gcc和makefile使用简介
    基于OWin的Web服务器Katana发布版本3
    OAuth和OpenID的区别
    关于 Token,你应该知道的十件事
    HTTP Header 详解
    Entity Framework教程及文章传送门
    CSP(Content Security Policy) 入门教程
    gulp构建工具的几个使用技巧
    浅谈程序员的英语学习
    如何选择正确的angular2学习曲线?
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/4321398.html
Copyright © 2020-2023  润新知