首页 > 其他分享 >LIS于LCS

LIS于LCS

时间:2025-01-19 21:48:09浏览次数:1  
标签:那么 LCS nums len 数组 LIS 序列 dp

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_left
        n=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]+1
                else:
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1])
        # for i in dp:
        #     print(i)
 
        return dp[len(text1)][len(text2)]

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

那就到这里了。

标签:那么,LCS,nums,len,数组,LIS,序列,dp
From: https://www.cnblogs.com/fufufuf/p/18680197

相关文章

  • newArrayListWithExpectedSize
    ewArrayListWithExpectedSize并不是ArrayList的标准API,而是一个自定义的工具方法,它通常用于创建一个具有预估大小的ArrayList。通过预设一个适当的初始容量,可以减少或避免ArrayList在插入元素时的扩容。这个方法本质上是使用ArrayList(intinitialCapacity)构造函数,设置......
  • alist下载
    importrequestsimportosfromtqdmimporttqdmdefget_token(alist_url,username,password):"""登录并获取token"""login_url=f"{alist_url}/api/auth/login"data={"username":username,......
  • 【C++】list容器
    目录学习途径list的使用list的一些构造迭代器说明接口使用迭代器失效问题list和vector对比模拟实现list迭代器的模拟(重点)List.h文件学习途径在学习list之前,我们可以查询一些相关文档来学习!文档详情:list文档学习list的使用list的一些构造图:构造使用示范:......
  • LCS(递归/记忆化/dp)
    题目链接:https://leetcode.cn/problems/longest-common-subsequence/TLE暴力递归+记忆化版本(基于字符串长度无优化版本)//注意text1[i1-1]==text2[i2-1]classSolution{public:intdp[1000][1000];intlongestCommonSubsequence(stringtext1,stringtext2){......
  • Microsoft 推出 Trellis — 一种将图像转换为 3D 对象的 AI 模型
    微软Trellis:开启3D生成新纪元阅读时长:8分钟图片来源:微软研究院近日热文:全网最全的神经网络数学原理(代码和公式)直观解释欢迎关注知乎和公众号的专栏内容LLM架构专栏知乎LLM专栏知乎【柏企】公众号【柏企科技说】【柏企阅文】几周前,微软推出了一种名为Trellis的全新3D......
  • Python-基础-列表(list)
    目录1、列表1.1列表的定义1.2列表的特点2、列表的常用语法2.1常用操作2.2列表常用的方法2.3列表常用的函数3、列表推导式1、列表1.1列表的定义列表(List)是一种用于存储多个项目的可变数据结构。它允许你将不同类型的元素(如数字、字符串、甚至其他列表)组织在......
  • Emacs 折腾日记(九)——elisp 数组与序列
    elisp中序列是数组和列表的统称,序列的共性是内部数据有一个先后的顺序,它与C/C++中有序列表类似。elisp中的数组包括向量、字符串、char-table和布尔向量,它们的关系如下:在之前一章中已经介绍了序列中的一种类型——列表,本篇将介绍序列中的另外一种数据类型——数组数组简......
  • CentOS 7 - Could not resolve host: mirrorlist.centos.org; Unknown error
    CentOS7当运行yumupdate时,提示错误信息Couldnotresolvehost:mirrorlist.centos.org;UnknownerrorLoadedplugins:fastestmirror,ovlLoadingmirrorspeedsfromcachedhostfileCouldnotretrievemirrorlisthttp://mirrorlist.centos.org/?release=7&arch=x86......
  • 你有用过HTML5中的datalist标签吗?说说你对它的理解
    是的,我有用过HTML5中的<datalist>标签。<datalist>标签在HTML5中是一个相对较新的元素,它允许你提供一个“预定义”的选项列表,供用户在<input>元素中输入数据时选择。这个列表在用户输入时会作为下拉建议出现,但并不会限制用户只能输入列表中的选项,用户仍然可以输入任何他们想要的内......
  • List.Insert 导致的 CPU 爆高
    我们经常会使用List<T>作为数据存储容器。但在某些特殊场景下,List.Insert方法可能会引发严重的性能问题,例如CPU占用率飙升。示例程序以下是一个简单的控制台程序,模拟在List的开头不断插入数据:internalclassProgram{staticvoidMain(string[]args){List......