zoukankan      html  css  js  c++  java
  • 动态规划求两个序列的最长公共子序列

    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 }
     
  • 相关阅读:
    #负分小组WEEK1#本周工作小结+下周计划
    #负分小组WEEK1#软件开发之路——需求获取与相关建模
    #负分小组WEEK1#第一次会议纪要
    #负分小组WEEK1#软件开发之路——准备阶段
    #负分小组WEEK1#确定项目——“宝宝睡吧!”儿童睡前服务服务软件+计划分工
    p6spy sql 执行记录
    apache common-lang3 工具类
    根据 ip 定位
    springcloud 与 spring boot 版本对应关系
    PowerDesign 基于mysql 数据库建模
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/4321398.html
Copyright © 2011-2022 走看看