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

news2025/2/23 19:44:05

文章目录

  • 前言
  • 一、问题描述
  • 二、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.coloradmin.cn/o/26065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式很难吗,这篇带你熟悉设计模式

3.1 概述 可以发现&#xff0c;设计模式好像都是类似的。越看越感觉都着不多。其实都是类似面向接口编程的一种体现&#xff0c;只不过侧重点不一样或者说要体现的结果不一样。 3.2 使用场景 问题一&#xff1a;应对可能变化的对象实现 方案&#xff1a;间接创建 模式&…

pycharm远程连接服务器

遇到的问题&#xff1a; 在服务器上配环境 流程&#xff1a; 先安装anaconda&#xff08;去其官网下载个脚本文件到服务器上&#xff0c;然后启动脚本即可&#xff09; bash Anaconda3-5.3.1-Linux-x86_64.sh然后创建 python环境 conda create -n pytorch python3.10去pyt…

【Linux】搞懂进程地址空间

文章目录1、从程序地址空间开始1.1 在C/C中看到的地址实际是&#xff1f;1.2 感性理解虚拟地址空间2、进程地址空间2.1 进程地址空间是怎样被描述的&#xff1f;2.2 进程地址空间和内存的关系2.3 为什么需要进程地址空间&#xff1f;1、从程序地址空间开始 1.1 在C/C中看到的地…

并发:线程状态

java的线程状态分为六种 新建 NEW 当一个线程对象被创建&#xff0c;但是还没有调用start方法时处于新建状态 此时未与操作系统底层线程关联 可运行 RUNNABLE 调用了start方法&#xff0c;就会由新建进入可运行状态 此时与底层线程关联&#xff0c;由操作系统调度执行 &…

python就是学不会怎么办?

编程从来都不是只看&#xff0c;只照葫芦画瓢就能学会的学科要想学会&#xff0c;必须是要有你个人是思考的&#xff0c;学会掌握编程逻辑&#xff0c;在学的过程中想为什么这么写&#xff0c;应该怎么去实现这个功能&#xff0c;拆分为几步不断的实操练习才能让你真的掌握知识…

并发,并行,串行,同步,异步,进程,进程池,线程,线程池

并发&#xff0c;并行&#xff0c;串行&#xff0c;同步&#xff0c;异步&#xff0c;进程&#xff0c;进程池&#xff0c;线程&#xff0c;线程池 进程 什么是进程&#xff1a; 开发写的代码称之为程序&#xff0c;将程序运行起来&#xff0c;就是进程 进程是申请一块内存空…

vue中动态引入图片为什么要是require, 你不知道的那些事

相信用过vue的小伙伴,肯定被面试官问过这样一个问题:在vue中动态的引入图片为什么要使用require 有些小伙伴,可能会轻蔑一笑:呵,就这,因为动态添加src被当做静态资源处理了,没有进行编译,所以要加上require, 我倒着都能背出来… emmm… 乍一看好像说的很有道理啊,但…

Linux实现文件定期本地备份/异地备份/删除备份的脚本

一.背景 1.总会出出现环境上的数据丢失&#xff0c;在没有备份的情况下会非常的被动&#xff0c;不管是由于病毒还是人为的原因造成的程序、数据被删除&#xff0c;有时候后悔已经来不及&#xff0c;不如提前做到数据的备份&#xff0c;而异地备份也更加的保险一点。 2.数据备…

【Servlet】1:踏入JavaWeb的第一把钥匙

目录 第一章 | JavaWeb序章 | 章节概述 | JavaWeb项目运行流程 | 静态与动态资源 | Javaweb开发人员的三个任务 第二章 | HTTP网络协议 | 章节概述 | HTTP简介 | HTTP请求三要素 | HTTP请求包、响应包 | HTTP状态码 | HTTPS vs HTTP 本文章属于后端全套笔记的第三部…

Jenkins 如何 使用企业权限 登录

实现方式 基于Jenkins的 “CAS Plugin” 和 “Role-based Authorization Strategy”插件实现 CAS Plugin: 该插件支持使用CAS作为身份验证源&#xff0c;以支持单点登录(SSO)。一般的&#xff0c;企业都会有 这么一个服务&#xff0c;提供企业 统一身份管理&#xff0c;比如 百…

【GlobalMapper精品教程】026:影像黑边白边出现的原因及解决办法汇总

本文讲解Globalmapper中,影像黑边白边出现的原因及解决办法汇总。 文章目录 1. 影像黑边白边出现的原因2. 影像黑边白边的解决方法1. 影像黑边白边出现的原因 通常,由于影像格式、像素深度、无效值、背景值等原因,会产生黑边或者白边,给影像的拼接或者裁剪带来困扰。 2. …

基于ERP集成的流程制造管理系统

ERP的含义是企业资源计划&#xff0c;含义是对企业所拥有各种资源进行综合规划和优化管理&#xff0c;用以降低成本&#xff0c;提高效率&#xff0c;增加利润。ERP最初是在90年代初提出的&#xff0c;那时的ERP概念&#xff0c;还只是根据计算机技术的发展和供需链管理,推论各…

什么是GEMM?该怎么去学习GEMM?

什么是GEMM&#xff1f; 它的英文全称是 GEneral Matrix to Matrix Multiplication (通用矩阵的矩阵乘法)&#xff0c;Gemm在神经网络的计算中占据很重要的位置。 它代表全局矩阵到矩阵的乘法&#xff0c;它本质上完全按照它在tins上所说的那样&#xff0c;将两个输入矩阵乘法在…

批量替换网站程序中的gotoip域名

网站访问出现验证页面,这是因为网站调用了二级域名&#xff0c;西部数码二级域名用于测试访问效果&#xff0c;不能用于正式访问&#xff0c;但是有些用户网站调试安装时使用了二级域名&#xff0c;内部链接没有修改&#xff0c;所以访问调用出现了验证页面。 这时要检查网站后…

DBCO(二苯并环辛炔)DBCO-PEG16-Benzylamine特点分享

【产品描述】 DBCO-PEG16-Benzylamine固体状&#xff0c;长链小分子PEG点击试剂&#xff0c;DBCO&#xff08;二苯并环辛炔&#xff09;是一种环炔烃&#xff0c;可以通过在水溶液中通过应变促进的1,3-偶极环加成反应与叠氮化物反应&#xff0c;这种生物正交反应也称为无铜点击…

前端、vue、Vue3弹幕实现;前端CSS实现弹幕

前端基于CSS3实现弹幕 基于CSS3动画 根据 Google Developer&#xff0c;渲染线程分为 主线程 (main thread) 和 合成线程 (compositor thread)。如果 CSS 动画只是改变 transforms 和 opacity&#xff0c;这时整个 CSS 动画得以在 合成线程 完成&#xff08;而JS动画则会在 主…

PTA题目 最佳情侣身高差

专家通过多组情侣研究数据发现&#xff0c;最佳的情侣身高差遵循着一个公式&#xff1a;&#xff08;女方的身高&#xff09;1.09 &#xff08;男方的身高&#xff09;。如果符合&#xff0c;你俩的身高差不管是牵手、拥抱、接吻&#xff0c;都是最和谐的差度。 下面就请你写个…

HTTP Only限制XSS盗取cookie

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是HTTP Only限制XSS盗取cookie。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对…

使用 Helm Cli 将 chart 推送到 Harbor

使用 Helm Cli 将 chart 推送到 Harbor 背景问题 努力寻找适用于特定版本的 Harbor 和 Helm 的文档。 我尝试添加我的仓库&#xff08;repo&#xff09; helm repo add harbor https://myharbor.mydomain.com/chartrepo/myproject --username myusername --password mypass…

NXP iMX8M Plus M7核心FreeRTOS开发

By Toradex胡珊逢 Toradex 的 Verdin iMX8M Plus 计算机模块采用 NXP 的 iMX8M Plus 处理器。该 CPU 除了有支持 AI 硬件加速单元的 NPU 外&#xff0c;还配置了一个 M7 微控制器。相比于 iMX 8 QuadMax 处理器上时钟频率为 266MHz 的M4 微控制器&#xff0c; 该M7 的时钟频率…