LIS于LCS

news/2025/1/19 21:31:22/文章来源:https://www.cnblogs.com/fufufuf/p/18680197

LIS与LCS是动态规划中最常见的两种情况,LIS也就是最长上升子序列,而LCS是最长公共子序列。

在解决这个问题之前,先要明白为什么是序列,举个例子来说明,在数组 [1,2,3,4,5,6]中,[2,3,5]就是其子序列,也就是说,子序列其实就是数组中存在先后顺序,但不强调连续的子数组。那么,在了解了序列是什么之后,就来看一下题吧。

首先是LIS:即求最长上升子序列。
​​
那么既然是动态规划,那就要去找状态转移方程,那么,我可以设置为对于dp【j】表示以nums【j】为结尾的递增子序列的长度

那么这时,就可以尝试用代码来实现:
这里就是用dp数组表示当前的最大上升子序列的长度的代码,那么对于这个来处理的方法就是如下,首先遍历nums数组,然后再遍历nums【i】之前的所有数字nums【j】若是当前的数字nums【i】的值比nums【j】大,那么就二者进行比较,此时运用max数组来对dp【i】和dp【j】进行比较,来决定增加,最后输出dp数组中的最大值,最后,就可以得到答案。

但是,这个代码只是O(n2)的复杂度,只可以处理104级别的数据,因此,需要去优化代码,

那么如何去优化呢,可以尝试如下的方案,将其优化到O(nlogn)的级别,那么如何来处理?

便是直接去遍历数组,维护一个单调递增的序列即可。

Python

class Solution:def lengthOfLIS(self, nums):from bisect import bisect_leftn=len(nums)dp=[]for i in range(n):if not dp or nums[i]>dp[-1]:dp.append(nums[i])else:idx=bisect_left(dp,nums[i])dp[idx]=nums[i]return len(dp)

在这里其实就是在维护一个单带增加的序列,因为从第一个数开始,由于求递增序列,在遍历的过程中,若是当前的数比dp的最后一项大,那么这个数一定会让序列增加,而若是这个数字小于等于dp数组的最后一个数,那么这个数一定不会让递增子序列的数字增加,这时,就使用二分查找来更新dp数组,将这个数字替换到对应的位置,这样子就可以维护一个dp数组,最后dp数组的长度就是最大dp递增子序列。

这个就是一个更优的题解。

而LCS则是去求最长公共子序列

要求解这道题,就要去找状态转移方程,这里由于有两个字符串,那么就要使用二维dp,dp【i】【j】表示分别到i为止和到j为止最长公共子序列的长度,那么接着就是去找状态转移方程。这道题的状态转移方程就是

dp【i】【j】=dp【i-1】【j-1】 --------当str1【i】==str2【j】的时候;

dp【i】【j】=max(dp【i-1】【j】,dp【i】【j-1】)--------其他情况。

那么在这里就可以写出代码了

class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:dp=[[0]*(len(text2)+1) for i in range(len(text1)+1)]# for i in dp:#     print(i)for i in range(1,len(text1)+1):for j in range(1,len(text2)+1):if text1[i-1]==text2[j-1]:dp[i][j]=dp[i-1][j-1]+1else:dp[i][j]=max(dp[i-1][j],dp[i][j-1])# for i in dp:#     print(i)return dp[len(text1)][len(text2)]

这里就是关于这道题的实现。

那就到这里了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871865.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

层次分析法:数学建模

今天学习了层次分析法和数学建模,这里就简单写一下自己的学习新的,参考的资料是B站上的免费网课,老师讲的不错,可以去围观,学习,希望可以拿个奖。https://www.bilibili.com/video/BV1p14y1U7Nr/?spm_id_from=333.337.search-card.all.click 上面这里是链接。本文的大部分…

那些年我在 HL 集训做的题【某人别催了!】

某人别催了!!!Day 0 1.16 下午到 HL,居然还写了一道题? P8855 [POI2002] 商务旅行 LCA 板子。不理解当时为啥要写这个东东,可能是为了热热身吧。 Day 1 讲整体二分,但是没听懂。貌似是魔改版 CDQ...不管它。但是我似乎发现了一片新天地,一切的一切都从下面的一道题说起…

Mac 刷题环境配置

方便Mac 刷题,记录一些环境配置Mac 刷题环境配置 这篇博文主要记录自己为了更方便的在 Mac 上写算法题,主要是基于 Clion做的一些环境配置;有些操作其实在 Windows ,Linux 下也是通用的,如果看到的小伙伴也可以结合自己的情况参考。 Clion 插件 推荐一下这个插件 C/C++ Si…

excel对列数据去重(数据核对)

第一步,选中A列数据,单击功能区——数据选项卡——高级第二步,在弹出的对话框中,选中“将筛选结果复制到其他位置”,"列表区域"填写A列的地址:$A$1:$A$17,“复制到”填写:B1,把“选择不重复记录”勾上,确定即可。结果如下图

前端开发day1

day1 目的:开发一个平台(网站)- 前端开发:HTML、CSS、JavaScript- Web框架:接收请求并处理- MySQL数据库:存储数据地方快速上手:基于Flask Web框架让你快速搭建一个网站出来。深入学习:基于Django框架(主要)1,快速开发网站 pip install flaskfrom flask import Flask…

Centos7.9安装phpldapadmin

Centos7.9安装phpldapadmin@目录一、背景二、正文2.1 安装phpldapadmin2.4 登录phpldapadmin界面三、安装途中可能碰到的报错错误场景1:执行步骤“安装phpldapadmin”执行命令:yum install -y phpldapadmin时报错错误场景2:安装phpldapadmin完成后,apache启动报错,执行启动…

数据库密码安全修改:保护织梦网站账户安全的黄金法则

严格权限控制:仅授予最小化权限给真正需要访问数据库的人,避免不必要的暴露风险。定期清理过期账号,防止非法入侵。 日志记录完善:开启详细的日志记录功能,记录下每一次登录、退出、增删改查等关键事件。一旦发现问题可以迅速定位原因并采取相应措施。步骤 描述备份数据优…

为什么网站后台连接不了并报错?

当您发现网站后台无法连接并报错时,可能是由多种原因引起的。为了有效解决问题,我们需要从多个角度进行排查和优化。以下是详细的解决方案: 一、检查数据库连接数据库配置:确认数据库配置文件(如config.php)中的连接参数是否正确。 包括数据库主机名、端口、用户名、密码…

为什么设置了自定义错误页面后无法登录网站后台

设置自定义错误页面后无法登录网站后台是一个常见的问题,通常由配置不当或冲突引起。要解决这个问题,我们需要仔细检查相关配置文件,并确保各个组件之间的兼容性。以下是详细的排查和解决方法: 一、检查自定义错误页面配置配置文件位置:根据服务器类型,自定义错误页面的配…

如何迁移服务器数据并确保新旧服务器上的数据一致?

在业务扩展或更换服务器时,迁移服务器数据是一项关键任务,确保新旧服务器上的数据一致至关重要。以下是详细的迁移步骤和注意事项: 一、准备阶段备份现有数据:在迁移之前,务必对现有服务器上的所有重要数据进行完整备份。这包括数据库、网站文件、配置文件等。 使用压缩工…

云主机升级后网站访问速度变慢的原因及解决方案

当您完成云主机的升级后,如果发现网站的访问速度明显变慢,可能由多种因素引起。首先需要明确的是,升级本身并不会直接导致访问速度下降;然而,某些配置不当或其他外部因素确实会影响最终的表现。以下是几个常见的原因及其对应的解决方法: 1. 页面资源加载问题现象:某些第…

宝塔面板无法登录怎么办?

当您遇到无法登录宝塔面板的情况时,可能是由于多种原因引起的,包括但不限于端口不通、服务未启动、磁盘空间不足等。为了快速恢复宝塔面板的正常使用,请按照以下步骤进行排查和修复: 1. 检查端口连通性 首先,确认服务器的8888端口是否对外网开放。可以使用在线端口检测工具…