动态规划算法学习二:最长公共子序列

news/2024/6/16 16:02:37 标签: 算法, 动态规划, 学习

文章目录

  • 前言
  • 一、问题描述
  • 二、DP实现
    • 1、最优子结构性质*****
    • 2、状态表示*****
    • 3、状态递归方程*****
    • 4、计算最优值*****
    • 5、代码实现:输出最长公共子序列
    • 6、代码实现:输出最优解

前言

一、问题描述

在这里插入图片描述

  • 列举X的所有子序列,然后检查它是否也是Y的子序列,从而确定它是否是X和Y的公共子序列。枚举算法的时间复杂度为指数级时间复杂度。

二、DP实现

1、最优子结构性质*****

在这里插入图片描述
注意: 可能同时有多个长度相等的最长公共子序列!
在这里插入图片描述
倒推—从最后一个元素开始分析

在这里插入图片描述

2、状态表示*****

  1. 输入序列对(X(m-1),Y(n-1) ),(X(m-1),Yn ) 和(Xm,Y(n-1) )都分别表示一个子问题 (xm等于或不等于yn,都可以分解为这三个子问题)

  2. 子问题可以通过两个参数确定,即序列 X 的长度和序列 Y 的长度

  3. C(i,j)表示序列Xi={x1,x2,…,xi }和Yj={y1,y2,…,yj } 的最长公共子序列长度

  4. C(m, n)则表示原问题的最长公共子序列长度

3、状态递归方程*****

  • 当i=0或j=0时,C(i,j)=0;
  • 当i, j>0时,C(i,j)的求解包括 两种情况
    1. xi=yj时, (X(i-1),Y(j-1) )的最长公共子序列末尾添加元素xi (=yj),即可得到(Xi,Yj )的最长公共子序列
    2. xi≠yj时,(Xi,Yj )的最长公共子序列等于(Xi,Y(j-1) )和(X(i-1),Yj )的最长公共子序列的较大者
      在这里插入图片描述

4、计算最优值*****

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:
当第一次遍历 自底向上求解时,X[1] != Y[1],所以走第三条路:求c[0][1] c[1][0]的最大值,但是这两个值都是0,所以取哪一个都可以,所以后续求最长公共子序列的 序列时,这里的左箭头和上箭头都是一样的,

  1. 第一次遍历:

5、代码实现:输出最长公共子序列

代码的输出 就是最长公共子序列的长度

public class Main {
    public static int MAX = 1000;

    public static int lcsLength(char[] strX,char[] strY) {
        int[][] C = new int[MAX][MAX], B = new int[MAX][MAX];
        int i, j;

        int m = strX.length + 1;
        int n = strY.length + 1;
        for (i = 0; i < m; i++)
            C[i][0] = 0;  //初始化第一行
        for (j = 0; j < n; j++)
            C[0][j] = 0;  //初始化第一列
        for (i = 1; i < m; i++) {
            for (j = 1; j < n; j++) {
                if (strX[i-1] == strY[j-1]) {
                    C[i][j] = C[i-1][j-1] + 1;
                    B[i][j] = 1;
                } else if(C[i - 1][j] >= C[i][j - 1]) {
                    C[i][j] = C[i-1][j];
                    B[i][j] = 2;
                } else {
                    C[i][j] = C[i][j-1];
                    B[i][j] = 3;
                }
            }// end for(j
        }//end for(i
        return C[m - 1][n - 1];
    }

    public static void main(String[] args) {
        char[] x = {'A', 'B', 'C', 'B', 'D', 'A', 'B'};
        char[] y = {'B', 'D', 'C', 'A', 'B', 'A'};
        int i = lcsLength(x, y);
        System.out.println(i);
    }
}

6、代码实现:输出最优解



http://www.niftyadmin.cn/n/10736.html

相关文章

LIN通讯

LIN通讯 一、LIN通讯的背景与意义 随着汽车电子的发展&#xff0c;汽车上的电子零件正在逐渐地增加。而电子零件的增加也导致更多的设备&#xff08;传感器、执行器、电子控制器&#xff09;需要加入汽车的局部网络&#xff0c;这些零件的增加还会带来配线的增加&#xff0c;…

【Codeforces Round #835 (Div. 4)】A——G题解

文章目录A Medium Number题意思路代码B Atillas Favorite Problem题意思路代码C Advantage题意思路代码D Challenging Valleys题意思路代码E Binary Inversions题意思路代码F Quests题意思路代码G SlavicGs Favorite Problem题意思路代码A Medium Number 题意 三个数&#xf…

图片如何加水印?教你几招轻松加

相信很多喜欢出门游玩的小伙伴&#xff0c;会习惯将旅途中遇到的风景、趣事将其拍照记录下来&#xff0c;然后将图片分享到社交账号上去&#xff0c;但是互联网上什么人都有&#xff0c;总会有不怀好意的人&#xff0c;会在网上拿别人辛苦拍摄的照片&#xff0c;据为己有去发布…

【Linux】基本指令(二)

文章目录rmdir&&rm 指令nano 指令whoami 指令man 指令cp 指令mv 指令echo 指令cat 指令wc 指令more 指令less 指令head 指令tail 指令date 指令cal 指令rmdir&&rm 指令 &#x1f495; rmdir是一个与mkdir相对应的命令。 mkdir是建立目录&#xff0c;而rmdir是…

新力量,新希望|明道云伙伴大会2022秋圆满落幕

2022年10月28日至29日&#xff0c;明道云伙伴大会&#xff08;2022年秋&#xff09;在上海顺利举办。来自北京大兴国际机场、广汽本田、京东方、天津钢管、深圳龙华区卫健局、可口可乐、山东移动、浙江移动、上海电气数科、金科信息、艾默生电气等超过五百位参会者同台交流。行…

【CSS】CSS文本样式【CSS基础知识详解】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSS】 【CSS专栏】已发布文章 &#x1f4c1;【CSS基础认知】 &#x1f4c1;【CSS选择器全解指南】 &#x1f4c1…

可观测性-Event-埋点数据模型

埋点数据模型 埋点的目标是RED(Request,Error,Duration) 初期 当上线初期整体数据量不大的时候&#xff0c;我们可以统统以事件&#xff08;event&#xff09;来埋点。 例如埋点数据模型如下&#xff1a; measurement: laker_order #metrics name fileds:value: 398 # 泛化…

Axure原型创建折线、柱状等图形,引用echarts

1、在echarts网站选择对应的统计图形&#xff1a; 网址&#xff1a;Examples - Apache ECharts 2、对代码进行编辑&#xff0c;使其适配自己的业务。 3、在Axure中创建一个基本元件矩形。命名为&#xff1a;test 4、选择交互--载入时--打开连接--Fx 5、在插入变量中增加如下…