经典DP-最长单调子序列

最长递增子序列

思路

  1. 定义状态
    • 我们定义一个数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。
  2. 初始化状态
    • 对于数组中的每个元素 nums[i],初始时都可以被视为一个长度为1的递增子序列,因此 dp[i] 的初始值都设为1。
  3. 状态转移方程
    • 对于数组中的每个位置 i,我们遍历它之前的所有位置 jj < i)。
    • 如果 nums[i] 大于 nums[j],说明 nums[i] 可以接在以 nums[j] 结尾的递增子序列后面,形成一个更长的递增子序列。
    • 在这种情况下,我们可以更新 dp[i] 为 dp[j] + 1,表示以 nums[i] 结尾的递增子序列长度是以 nums[j] 结尾的子序列长度加1。
    • 我们需要遍历所有 j < i 的情况,并取 dp[j] + 1 中的最大值来更新 dp[i]
  4. 求解结果
    • 在完成所有状态转移后,dp 数组中的最大值就是最长递增子序列的长度。
    • 因为 dp[i] 存储的是以 nums[i] 结尾的最长递增子序列的长度,所以最长递增子序列的实际长度可能不在数组末尾,而是在数组中的某个位置。
    • 因此,我们需要遍历整个 dp 数组来找到最大值,这个最大值就是最长递增子序列的长度。
  5. 优化空间复杂度
    • 上述方法的空间复杂度是 O(n),因为我们需要一个大小为 n 的 dp 数组来存储状态。
    • 但实际上,我们只需要知道前一个状态 dp[j] 的值来更新当前状态 dp[i],因此可以使用一个变量来替代整个数组,从而将空间复杂度优化到 O(1)。
  6. 实现细节
    • 在实际编码时,我们需要处理边界情况,比如输入数组为空或只有一个元素的情况。
    • 在 main 方法中,我们需要创建 LongestIncreasingSubsequence 类的实例,并调用其 lengthOfLIS 方法来获取结果。

代码


import java.util.Scanner;
//给你一个整数数组nums,
//找到其中最长严格递增子序列的长度
public class 最长递增子序列 {//写一个方法public int lengthOfLIS(int [] nums) {//在方法的开始,我们首先处理边界情况if(nums==null || nums.length==0) {return 0;}//dp[i]将存储以nums[i]结尾的最长递增子序列的长度。int[] dp=new int[nums.length];//初始化一个变量maxLength,用于跟踪目前为止找到的最长递增子序列的长度int maxLength=1;for(int i=0;i<nums.length;i++) {dp[i]=1;//将dp[i]初始化为1,因为任何元素都可以作为一个长度为1的递增子序列。for(int j=0;j<i;j++) {//再用一个内层for循环遍历当前元素之前的所有元素。//在内层循环中,我们检查当前元素nums[i]是否大于前面的元素nums[j]if(nums[i]>nums[j]) {dp[i] = Math.max(dp[i], dp[j]+1);}}maxLength=Math.max(maxLength, dp[i]);}return maxLength;}public static void main(String[] args) {Scanner scan = new Scanner(System.in);最长递增子序列 ss =new 最长递增子序列();int [] nums= {10,9,2,5,3,7,101,18};int result = ss.lengthOfLIS(nums);System.out.println(result);  }
}

最长递增子序列的个数

代码

import java.util.Arrays;public class 最长递增子序列的个数 {public int findNumberOfLIS(int[] nums) {if(nums==null || nums.length==0) {return 0;}int n=nums.length;int[] dp=new int[n];//dp[i] 存储以 nums[i] 结尾的最长递增子序列的长度int[] count = new int[n];//count[i] 存储以 nums[i] 结尾的最长递增子序列的个数Arrays.fill(count, 1);//初始化count数组,每个元素的最长递增子序列至少包含一个元素int maxLength = 1;//最长递增子序列的长度for(int i=0;i<n;i++) {dp[i]=1;for(int j=0;j<i;j++) {if(nums[i]>nums[j]) {if(dp[j]+1>dp[i]) {//如果发现一个更长的递增子序列,更新 dp[i] 并重置 count[i]  dp[i]=dp[j]+1;count[i]=count[j];}else if(dp[j]+1==dp[i]){count[i] += count[j];}}}maxLength = Math.max(maxLength, dp[i]);}int result=0;for(int i=0;i<n;i++) {if(dp[i]==maxLength) {result+=count[i];}}return result;}public static void main(String[] args) {最长递增子序列的个数 solution=new 最长递增子序列的个数();int [] nums= {1,3,5,4,7};int count=solution.findNumberOfLIS(nums);System.out.println(count);}}

知识点

Arrays.fill(count, 1);

 是 Java 中的一个方法调用,用于将数组 count 的所有元素设置为指定的值,即 1。这个方法来自于 java.util.Arrays 类,是一个静态工具类,提供了很多用于操作数组(例如排序、搜索、填充等)的静态方法。

在这个特定的情境下,Arrays.fill(count, 1); 被用来初始化 count 数组。由于我们正在计算最长递增子序列的个数,每个元素至少可以作为一个长度为 1 的递增子序列的结束元素。因此,count 数组的每一个位置都被设置为 1,意味着每个元素开始时都被视为一个独立的递增子序列。

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

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

相关文章

2.29IO进程线程

编写链表&#xff0c;链表里面随便搞点数据 使用 fprintf 将链表中所有的数据&#xff0c;保存到文件中 使用 fscanf 读取文件中的数据&#xff0c;写入链表中 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h>typed…

“集世界精华·展中国风采”2024北京智能科技展会(世亚智博会)

在科技的浪潮中&#xff0c;中国犹如一艘乘风破浪的巨轮&#xff0c;稳健地航行在广阔的海洋上。随着科技的飞速发展&#xff0c;中国正逐渐成为全球科技领域的一面旗帜&#xff0c;引领着世界科技潮流。在这个伟大的时代&#xff0c;中国以卓越的科技创新能力和前瞻的战略视野…

vue-electron 项目创建记录及注意事项

vue-electron 项目创建记录及注意事项 1、使用vue ui或者命令行创建vue项目 2、添加electron插件 3、安装element-plus: npm install --save element-plus 4、修改配置文件如下图: vue.config.js增加配置&#xff1a; pluginOptions:{ electronOutput: { contextIsolation…

WiFi模块引领智能家居革命:连接未来的生活

随着科技的快速发展&#xff0c;智能家居正成为现代生活的一部分&#xff0c;极大地改变了我们与家庭环境互动的方式。其中&#xff0c;WiFi模块作为关键的连接技术&#xff0c;在推动智能家居革命中发挥着不可忽视的作用。本文将深入探讨WiFi模块如何驱动智能家居革命。 设备互…

Linux——haproxy搭建Web群集

一、haproxy概述 HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP的应用代理&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器&#xff0c;防止内部服务器遭受攻…

TVM 和模型优化的概述(1)

文章目录 1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型&#xff08;model&#xff09;。2.翻译成 Relay3. lower 到 张量表达式。4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。5. 选择最佳配置进行模型编译。6. lower 到 TIR。7. 编译成机器码…

QML中动态增加表格数据

1.QML中的表格实现 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableModel{id:table_modelTabl…

Stable Diffusion 模型分享:Henmix_Real(人像、真实、写真、亚洲面孔)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 作者述&#xff1a;这个模型试图改变&#xff0c;以便西方人和亚洲人都能够表达得很好。此…

认识通讯协议——TCP/IP、UDP协议的区别,HTTP通讯协议的理解

目录 引出认识通讯协议1、TCP/IP协议&#xff0c;UDP协议的区别2、HTTP通讯协议的讲解 Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 认识通讯协议——TCP/IP、UDP协议的区别&#xff0c;HTTP通讯协议的理解 认识通讯协议 …

适用Java SpringBoot项目的分布式锁

在分布式系统中&#xff0c;常用到分布式锁&#xff0c;它有多中实现方式&#xff0c;如&#xff1a;基于redis&#xff0c;database&#xff0c;zookeeper等。Spring integration组件有这三种服务的分布式锁实现&#xff0c;今天来看看用的比较多的redis和database实现方式。 …

Element ui plus 中 table scroll 自动触底

Element ui plus 中 table scroll 自动触底 场景&#xff1a;添加客户等级的时候&#xff0c;新增的客户等级 input 框 被 scroll 遮挡、重叠&#xff0c;需要保证 scroll 保持在 最底部接可以解决 遮挡、重叠。 el-table 在设置了 height 后&#xff0c;会选择将 table 表头固…

自动采集API壁纸系统源码自适应手机端

HTML5响应式自动采集API壁纸系统源码自适应手机端 瀑布流加载 源码下载&#xff1a;https://www.qqmu.com/2303.html