• 算法分析与实践-作业9


    LCS算法

    3. 设计

     1 #include<stdio.h>
     2 #include<string.h>
     3 const int maxn = 1000 + 10;
     4 char x[maxn], y[maxn];
     5 int dp[maxn][maxn];
     6 int b[maxn][maxn];   //b[i][j]=0为删除两个,b[i][j]=1为删除x,b[i][j]=2为删除y 
     7 char lcs[maxn];
     8 int n, m;             //n为字符串x的长度,m为字符串y的长度 
     9 int main() {
    10     scanf("%d", &n);
    11     scanf("%s", x + 1);
    12     scanf("%d", &m);
    13     scanf("%s", y + 1);
    14     //初始化 
    15     for (int i = 0; i <= m; ++i)dp[0][i] = 0;
    16     for (int i = 0; i <= n; ++i)dp[i][0] = 0;
    17 
    18     /*----------以下为求最长公共子序列长度----------*/
    19     for (int i = 1; i <= n; ++i) {
    20         for (int j = 1; j <= m; ++j) {
    21             if (x[i] == y[j]) {
    22                 dp[i][j] = dp[i - 1][j - 1] + 1;
    23             }
    24             else {
    25                 if (dp[i - 1][j] > dp[i][j - 1]) {
    26                     b[i][j] = 1;
    27                     dp[i][j] = dp[i - 1][j];
    28                 }
    29                 else {
    30                     b[i][j] = 2;
    31                     dp[i][j] = dp[i][j - 1];
    32                 }
    33             }
    34         }
    35     }
    36     /*----------以上为求最长公共子序列长度----------*/
    37     /*----------以下为求最长公共子序列----------*/
    38     int i = n, j = m;
    39     while (i != 0 && j != 0) {
    40         if (b[i][j] == 0) {
    41             lcs[dp[i][j]] = x[i];
    42             i--, j--;
    43         }
    44         else if (b[i][j] == 1) {
    45             i--;
    46         }
    47         else {
    48             j--;
    49         }
    50     }
    51     /*----------以上为求最长公共子序列----------*/
    52     printf("最长公共子序列长度为:%d
    ", dp[n][m]);
    53     if (dp[n][m] != 0) {
    54         printf("最长公共子序列为:");
    55         for (int i = 1; i <= dp[n][m]; ++i) {
    56             printf("%c", lcs[i]);
    57         }
    58     }
    59 }

    4. 分析

    T(n)=O(nm)

    5. 源码

    https://github.com/JayShao-Xie/algorithm-work/blob/master/LCS.cpp

  • 相关阅读:
    密码学常用解码网站
    macOS VMware Fusion 中 vmtools为灰色
    XSS-Payloads
    Tomcat 漏洞总结
    mac 更新完Big Sur需重新配置项目
    sqlmap的使用 ---- 自带绕过脚本tamper
    FTP 日志分析
    CentOS Java环境问题
    Nginx 学习
    英语学习-邮件表达方法 例句
  • 原文地址:https://www.cnblogs.com/JayShao/p/12747499.html
Copyright © 2020-2023  润新知