• 最长共公子序列(LCS)


     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 using namespace std;
     5 char str1[55], str2[55];
     6 int f[55][55];//记录状态 
     7 //动态规划是一种记忆化搜索 
     8 /*有俩个字符串,求出他们的最长公共子序列
     9 ,例如:
    10 acdtfs
    11 aldtks
    12 最长公共子序列是adts,长度为4
    13 n,m
    14 string1(length = n)
    15 string2(length = m)
    16 f[i][j]表示1串第i个与第二个串第j个匹配得到
    17 的子序列最大长度
    18 f[i][j] = max(f[i - 1][j], f[i][j - 1]);
    19             f[i - 1][j - 1] + 1; 
    20 */
    21 int main(){
    22     int i, j, k;
    23     int n, m;
    24     scanf("%d%d",&n,&m);
    25     scanf("%s%s",str1 + 1, str2 + 1);
    26     f[0][0] = 0;
    27     for(int i = 1; i <= n; i++){
    28         for(int j = 1; j <= m; j++){
    29             if(str1[i] == str2[j]){
    30                 f[i][j] = f[i - 1][j - 1] + 1;
    31             }
    32             f[i][j]=max(f[i][j], f[i-1][j]);
    33             f[i][j]=max(f[i][j], f[i][j-1]); 
    34         }        
    35     }
    36     printf("%d
    ", f[n][m]);
    37     return 0;
    38 } 




     1 #include <iostream>
     2 using namespace std;
     3 /*有一串数,求出它的最大不下降子序列的
     4 长度(等于也包括)
     5 如1, 2, 5, 3, 6, 2, 9, 10
     6 答案是
     7 1 2 3 6 9 10(这只是其中之一)
     8 f[i]表示子序列包括数字i的时候,最长不下降子序列的长度 
     9 f[i] = max(f[j] + 1) a[i] > a[j];
    10     ans = max(f[i])
    11 */
    12 int a[222];
    13 int f[222];
    14 int memory[222];//记录状态 
    15 int main(){
    16     int i, j, k;
    17     int n;
    18     scanf("%d", &n);//数串的长度 
    19     for(i = 1; i <= n; i++){
    20         scanf("%d", &a[i]);
    21     }
    22     int temp;
    23     f[1] = 1;//第一个为1
    24     for(i = 2; i <= n; i++){
    25         f[i] = 0;
    26         for(j = 1; j <= i - 1; j++){
    27             if(a[i] > a[j]){//如果后面的数字更大 
    28                 if(f[i] < f[j] + 1){//如果后面数字的最长子序列长度小于前面最长子序列长度 + 1 
    29                     f[i] = f[j] + 1;//更新此时的最长子序列长度 
    30                     memory[i] = j;//记录i位置的前一个位置 
    31                 }    
    32             }    
    33         }
    34     }
    35     int ans = 0, mark;//mark用来取得记录最大不下降子序列的下标,ans用来记录大子序列的值 
    36     for(i = 1; i <= n; i++){
    37         if(ans < f[i]){ 
    38             mark = i;
    39             ans = f[i];    
    40         } 
    41     }
    42     temp = mark;
    43     //倒序输出记录状态 (这里可以利用一个栈顺序输出)
    44     while(temp > 0){
    45         printf("%d ", a[temp]);
    46         temp = memory[temp];
    47     }
    48     printf("
    %d
    ", ans);
    49     return 0;
    50 } 

     最长公共子序列的优秀博文:https://blog.csdn.net/someone_and_anyone/article/details/81044153

  • 相关阅读:
    BaseServlet的编写
    两个线程交替打印1-100
    java集合中的HashMap源码分析
    mybatis一级缓存与二级缓存的原理
    mybatis的执行流程
    spring IOC的理解
    一文彻底搞懂面试中常问的各种“锁”
    Dubbo相关的基础
    Servlet基础
    文件传输基础
  • 原文地址:https://www.cnblogs.com/AGoodDay/p/10741555.html
Copyright © 2020-2023  润新知