首页 > 其他分享 >递增子序列--连续与不连续

递增子序列--连续与不连续

时间:2024-02-19 10:45:35浏览次数:19  
标签:nums -- 递增 元素 连续 序列 最长 dp

问题一:最长严格递增子序列的长度

题目:
给定一个整数数组 nums ,找到其中最长严格递增子序列的长度。

状态定义:
dp[i] 表示以 nums[i] 结尾的最长严格递增子序列的长度。

状态转移方程
对于每个 nums[i],遍历其之前的所有元素 nums[j](j 从 0 到 i-1),如果 nums[i] > nums[j],则可以考虑将 nums[i] 加入到以 nums[j] 结尾的最长递增子序列中,状态转移方程为: dp[i] = max(dp[i], dp[j] + 1)。

动态规划解法:
我们使用 dp[i] 表示以 nums[i] 结尾的最长严格递增子序列的长度,不一定是连续的。(这就涉及到了选择的问题,我们需要考虑每个元素是否应该包含在递增子序列中。为了解决这个问题,我们使用动态规划数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。在更新 dp[i] 的过程中,需要考虑所有比 nums[i] 小的元素,并选择其中最长的递增子序列进行延伸。这就需要使用两层循环,其中外层循环遍历每个元素,内层循环遍历之前的元素,以确保每个元素都被考虑。)为了求解 dp[i],我们需要考虑所有在 i 之前的元素 nums[j],其中 j 可以从 0i-1。如果 nums[i] > nums[j],说明 nums[i] 可以接在以 nums[j] 结尾的递增子序列后面,此时 dp[i] = dp[j] + 1

def lengthOfLIS(nums):
    if not nums:
        return 0

    n = len(nums)
    dp = [1] * n

    for i in range(n):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)

    return max(dp)

问题二:最长连续递增子序列的长度

题目:
给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。

状态定义:
dp[i] 表示以 nums[i] 结尾的最长连续递增子序列的长度。

状态转移方程:
如果 nums[i] > nums[i-1],则 dp[i] = dp[i-1] + 1;否则,重新开始计算连续递增子序列,dp[i] = 1。

动态规划解法:
我们使用 dp[i] 表示以 nums[i] 结尾的最长连续递增子序列的长度。在这个问题中,我们只需要考虑当前元素和前一个元素的关系,如果 nums[i] > nums[i-1],说明可以将 nums[i] 加入到连续递增子序列中,此时 dp[i] = dp[i-1] + 1;否则,重新开始计算连续递增子序列,dp[i] = 1

def findLengthOfLCIS(nums):
    if not nums:
        return 0

    n = len(nums)
    dp = [1] * n

    for i in range(1, n):
        if nums[i] > nums[i - 1]:
            dp[i] = dp[i - 1] + 1
        else:
            dp[i] = 1

    return max(dp)

总结:
在动态规划中,问题的性质决定了状态转移的方式。在第一个问题中,子问题的解之间存在较为复杂的依赖关系,因此需要通过两层循环来更新动态规划数组。而在第二个问题中,子问题的解之间的依赖相对简单,只与前一个状态相关,因此只需要一层循环即可。
在第一个问题中,我们需要考虑每个元素与之前所有元素的关系,因此使用两层循环。而在第二个问题中,我们只需要考虑当前元素和前一个元素的关系,因此只需要一层循环。这反映了问题性质和解决方法的差异。

标签:nums,--,递增,元素,连续,序列,最长,dp
From: https://www.cnblogs.com/taixian/p/18020577

相关文章

  • JAVA基础-类加载过程
    1,类的加载1,类的加载过程2,加载阶段通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口加载class文件的方式:从本......
  • JAVA基础-jdk8新特性
    Java8新特性:接口默认方法和静态方法JDK1.8打破了接口只提供了形式,而未提供任何具体实现这一限制,允许定义默认方法和静态方法。定义一个接口:packagecom.zgjt.design.defaults;importjava.util.function.Supplier;publicinterfaceAnimal{//接口默认方法,不必重......
  • Java开发的SRM供应商、在线询价、招投标采购一体化系统源码功能解析
    前言:随着全球化和信息化的发展,企业采购管理面临越来越多的挑战。传统的采购方式往往涉及到多个繁琐的步骤,包括供应商筛选、询价、招投标等,这些过程不仅耗时,而且容易出错。为了解决这些问题,供应商、询价、招投标一体化系统应运而生。该系统通过集成供应商管理、询价管理、招投标......
  • Java对象引用和内存管理的细节
    在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁。对象的销毁是由Java的垃圾回收器(GarbageCollector,GC)来管理的。在Java中,局部变量(如方法参数)通常存储在栈内存(StackMemory)中,而对象实例(如ServletConfig对象)则......
  • ubuntu22.04安装conda
    1、获取脚本并执行wget-chttps://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.shbashAnaconda3-2020.11-Linux-x86_64.sh2、一直回车往下翻直到让输入yes如图: 3、输入完yes后,选择conda安装的路径回车的话是默认路径4、自己会安装所需的插件最后conda......
  • LKT安全芯片密钥管理与分散
    密钥管理是数据加密技术中的重要一环,密钥管理的目的是确保密钥的安全性(真实性和有效性)。为了数据使用的方便,数据加密在许多场合集中表现为密钥的应用,以达到保密的要求,因此密钥往往是保密与窃密的主要对象。由于系统的保密性主要取决于密钥的安全性,所以在公开的网络上安全地传送和......
  • C语言register关键字
    C语言中的register关键字用于向编译器建议将变量存储在寄存器中,以便更快地访问。它是一种优化技术,用于提高程序的执行速度。使用register关键字可以提高对该变量的访问速度,因为寄存器比内存访问速度更快。然而,使用register关键字并不能保证变量一定会存储在寄存器中,它只是向编译......
  • 水利信息化系统(水利工程 运行管理 信息化)
    ​ 引言水利信息化建设是提高水利工程管理水平、促进水资源优化配置的重要手段。星创易联基于自主研发的水利信息化系统,实现了水利工程监测预警、运维管理、水资源调度等功能,有效提升了水利工程运行管理信息化水平。(key-iot.com.cn)一、水利工程监测预警系统系统通过与水......
  • 26.jenkins构建时间显示和北京时间不一致
    方式一: 在Jenkins中,可以针对不同登录用户设置时区方法二:脚本命令执行系统管理----》脚本命令行----》输入命令----》点击运行System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai') ......
  • 15. C++类中成员变量的初始化总结
    C++类中成员变量的初始化总结1.普通的变量:一般不考虑啥效率的情况下可以在构造函数中进行赋值。考虑一下效率的可以再构造函数的初始化列表中进行。classCA{public:intdata;public:CA();};/*********/CA::CA():data(0)//……#1……初始化列表方式{......