算法分析:C语言实现动态规划之最长公共子序列

这篇具有很好参考价值的文章主要介绍了算法分析:C语言实现动态规划之最长公共子序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最长公共子序列问题:

        下面的简单问题说明了动态规划的基本原理。在字母表一∑上,分别给出两个长度为n和m的字符串A和B,确定在A和B中最长公共子序列的长度。这里,A = a₁a₂...an。的子序列是一个形式为a₁ka₂k...aik的字符串,其中每个i都在1和n之间,并且1<i₁< i₂<…<ik≤n。例如,如果∑= {x, y,z},A = zxyxyz和B= xyyzx,那么xzy 同时是A和B的长度为3的子序列。然而,它不是A和B最长的公共子序列,因为字符串xyyz也是A和B公共的子序列,由于这两个字符串没有比4更长的公共子序列,因此,A和B的最长的公共子序列的长度是4

        解决这个问题的-一种途径是蛮力搜索的方法:列举A所有的2^n个子序列,对于每一个子序列在O( m)时间内来确定它是否也是B的子序列。很明显,此算法的时间复杂性是O时间复杂度(m2²),是指数复杂性的。

        为了使用动态规划技术,我们首先寻找--个求最长公共子序列长度的递推公式,令A = a₁a₂...an和B= b₁b₂...bm,令L[i,j]表示a₁a₂...ai和b₁b₂...bj的最长公共子序列的长度。

        注意、i和j可能是0,此时,a₁a₂...ai和b₁b₂...bj中的一个或同时可能为空字符串。即如果i =0或 j =o,那么L[i,j]=0。很容易证明下面的观察结论。

        如果i和j都大于0,那么

        1.若ai=bj, L[i,j]= L[ i-1,j - 1]+1;

·        2.若ai≠bj, L[i,j ]= max{L[i,j - 1],L[ i- 1,j] }。

最长公共子序列算法伪码:

算法分析:C语言实现动态规划之最长公共子序列

 文章来源地址https://www.toymoban.com/news/detail-420712.html

 最长公共子序列公式:

 算法分析:C语言实现动态规划之最长公共子序列

 最长公共子序列解题思想:


A的长度为5 B的长度为7
A字符串:zxyyz
B字符串:zyxzyxz
    0   z   y   x   z   y   x   z
0   0   0   0   0   0   0   0   0
z   0   0   0   0   0   0   0   0
x   0   0   0   0   0   0   0   0
y   0   0   0   0   0   0   0   0
y   0   0   0   0   0   0   0   0
z   0   0   0   0   0   0   0   0
z与z相遇即相等,将左上角+1,并将其余的比较大小,1>0,所以将其他的值变为1,即得到下图↓
    0   z   y   x   z   y   x   z
0   0   0   0   0   0   0   0   0
z   0   1   1   1   1   1   1   1
x   0   1   1   1   1   1   1   1
y   0   1   1   1   1   1   1   1
y   0   1   1   1   1   1   1   1
z   0   1   1   1   1   1   1   1
x与x相遇即相等,y与y相遇即相等,将左上角+1得2,并将其余的比较大小,2>1,所以将其他的值变为2,即得到下图↓
    0   z   y   x   z   y   x   z
0   0   0   0   0   0   0   0   0
z   0   1   1   1   1   1   1   1
x   0   1   1   2   2   2   2   2
y   0   1   2   2   2   2   2   2
y   0   1   2   2   2   2   2   2
z   0   1   2   2   2   2   2   2
z与z相遇即相等,y与y相遇即相等,将左上角+1得3,并将其余的比较大小,3>2,所以将其他的值变为3,即得到下图↓
    0   z   y   x   z   y   x   z
0   0   0   0   0   0   0   0   0
z   0   1   1   1   1   1   1   1
x   0   1   1   2   2   2   2   2
y   0   1   2   2   2   3   3   3
y   0   1   2   2   2   3   3   3
z   0   1   2   2   3   3   3   3
z与z相遇即相等,将左上角+1得4,没剩余得值了,所以退出程序不用比较,即得到下图↓
    0   z   y   x   z   y   x   z
0   0   0   0   0   0   0   0   0
z   0   1   1   1   1   1   1   1
x   0   1   1   2   2   2   2   2
y   0   1   2   2   2   3   3   3
y   0   1   2   2   2   3   3   3
z   0   1   2   2   3   3   3   4

核心代码就那几行:

for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            if(a[i-1]==b[j-1])
                c[i][j]=c[i-1][j-1]+1;
            else
                c[i][j]=max(c[i][j-1],c[i-1][j]);
        }
    }

将数据一步一步的带入代码就可以理解了!

 代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
void lcs();
int max(int a,int b);

int main()
{
    lcs();
    return 0;
}
int max(int a,int b)
{
    return a>b?a:b;
}
void lcs()
{
    int n,m,i,j;
    char *a,*b;
    printf("分别输入A和B的长度:");
    scanf("%d%d",&n,&m);

    a=(char *)malloc(n*sizeof(char));
    b=(char *)malloc(n*sizeof(char));
    int c[n+1][m+1];

    printf("输入A字符串:");
        scanf("%s",a);
    getchar();
    printf("输入B字符串:");
        scanf("%s",b);
    for(i=0;i<=n;i++)c[i][0]=0;
    for(j=0;j<=m;j++)c[0][j]=0;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            if(a[i-1]==b[j-1])
                c[i][j]=c[i-1][j-1]+1;
            else
                c[i][j]=max(c[i][j-1],c[i-1][j]);
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            printf("%d  ",c[i][j]);
        }
        printf("\n");
    }
    printf("\n%d\n",c[n][m]);
    printf("按任意键继续\n");
}

结果实现: 

 算法分析:C语言实现动态规划之最长公共子序列

希望这对你有帮助! 

 

到了这里,关于算法分析:C语言实现动态规划之最长公共子序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 动态规划-最长公共子序列(c语言)

    动态规划-最长公共子序列(c语言)

    实验 3: 最长公共子序列 内容: 给定两个字符串str1和str2,输出两个字符串的最长公共子序列,如果最长公共子序列为空,则返回“-1”。目前给出的数据,仅仅会存在一个最长的公共子序列。 数据范围: 0 ≤|str1|,|str2|≤2000 要求: 空间复杂度O(n 2 ) 具体思路: step1:

    2024年02月04日
    浏览(13)
  • (Java) 算法——动态规划 最长公共子序列 图解

    (Java) 算法——动态规划 最长公共子序列 图解

    遇到了用动态规划来求解最长公共子序列问题,算法这块儿比较薄弱,便想着在网上找现成的思路和代码,也算拾人牙慧,但有一点没想到,都已经22年了,关于LCS问题网上给出的答案如此一言难尽……,只有零散几篇对于 新手 来说比较友好,但也仅仅这样,好在自己花了点

    2023年04月08日
    浏览(6)
  • 【算法】力扣【动态规划,LCS】1143. 最长公共子序列

    1143. 最长公共子序列 本文是对 LCS 这一 动态规划 模型的整理,以力扣平台上的算法题1143:最长公共子序列为模板题进行解析。 该题目要求计算两个字符串的最长公共子序列(Longest Common Subsequence,简称LCS)的长度。字符串的子序列是指在不改变字符顺序的情况下,通过删去

    2024年01月17日
    浏览(14)
  • 【算法(四·三):动态规划思想——最长公共子序列问题】

    【算法(四·三):动态规划思想——最长公共子序列问题】

    最长公共子序列(Longest Common Subsequence,简称LCS)问题是一种常见的字符串处理问题。它的**目标是找到两个或多个字符串中的最长公共子序列,这个子序列不需要是连续的,但字符在原始字符串中的相对顺序必须保持一致。**例如,考虑两个字符串\\\"ABCD\\\"和\\\"ACDF\\\",它们的最长公

    2024年04月13日
    浏览(8)
  • python数据结构与算法-动态规划(最长公共子序列)

    python数据结构与算法-动态规划(最长公共子序列)

    一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如:\\\"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y,求X和Y长度最大的公共子字列。 例:X=\\\"ABBCBDE”Y=\\\"DBBCDB”LCS(XY)=\\\"BBCD\\\" 应用场景:字符串相似度比对 (1)问题思考 思考: 暴

    2024年02月08日
    浏览(10)
  • 算法套路十五——动态规划求解最长公共子序列LCS

    算法套路十五——动态规划求解最长公共子序列LCS

    给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

    2024年02月04日
    浏览(8)
  • 【动态规划】最长公共子序列Python实现

    个人主页:丷从心 系列专栏:动态规划算法 问题描述 给定两个序列 X = {   x 1 , x 2 , ⋯   , x m   } X = set{x_{1} , x_{2} , cdots , x_{m}} X = { x 1 ​ , x 2 ​ , ⋯ , x m ​ } 和 Y = {   y 1 , y 2 , ⋯   , y n   } Y = set{y_{1} , y_{2} , cdots , y_{n}} Y = { y 1 ​ , y 2 ​ , ⋯ , y n ​ } ,找出 X X X

    2024年02月20日
    浏览(8)
  • 9.动态规划——4.最长公共子序列(动态规划类的算法题该如何解决?)

    9.动态规划——4.最长公共子序列(动态规划类的算法题该如何解决?)

    设最长公共子序列 d p [ i ] [ j ] dp[i][j] d p [ i ] [ j ] 是 S 1 S_1 S 1 ​ 的前 i i i 个元素,是 S 2 S_2 S 2 ​ 的前 j j j 个元素,那么有: 若 S 1 [ i − 1 ] = = S 2 [ i − 1 ] S_1[i-1]==S_2[i-1] S 1 ​ [ i − 1 ] == S 2 ​ [ i − 1 ] ,那么 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j]=dp[i-1][j-1]+1 d p [

    2024年04月11日
    浏览(12)
  • 算法 DAY52 动态规划10 1143.最长公共子序列 1035.不相交的线 53. 最大子数组和

    本题和动态规划:718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了 1、dp数组 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 2、递推公式 因为不强调是连续的,当前dp[i][j] 就有三种路径可以选:dp[i-1][j] dp[i][j-1]

    2024年02月03日
    浏览(11)
  • 动态规划--最长公共子序列

    动态规划--最长公共子序列

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题﹐ 即将大规模变成小规模 ,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是﹐适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。 他们之间有关系

    2024年02月04日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包