经典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,意味着每个元素开始时都被视为一个独立的递增子序列。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac电脑输入正确密码后提示密码错误

&#x1f3dd; 背景 Mac Pro 在擦键盘时&#xff0c;屏幕一直亮起&#xff0c;导致密码一致输入错误&#xff0c;想来没有什么问题便没有处理。但是&#xff01;&#xff01;&#xff01;在擦完键盘后输入正确的密码依旧提示密码错误&#x1f631; 接下来就是不断的重启、关机…

如何制作一款建材商城微信小程序

现在&#xff0c;微信小程序已经成为了很多企业和商家开展线上业务的重要渠道之一。对于建材商城而言&#xff0c;制作一款专属的微信小程序可以帮助企业更好地展示产品、提供服务&#xff0c;并增加销售额。下面将介绍如何制作一款建材商城微信小程序。 首先&#xff0c;登录【…

ai作画在线生成!这8个AI生图工具一定要知道。

过去的2023年被称作AI元年&#xff0c;随之而来的2024&#xff0c;被业内人士称之为AI应用元年&#xff0c;即随着大模型和各类AI应用的涌现速度放缓&#xff0c;人们关注的焦点也从产品层面&#xff08;有哪些好用的AI应用&#xff09;&#xff0c;转移到AI如何更好地赋能实际…

如何下载和配置Linux(使用VMware部署Centos)--看这篇文章就懂了

目录: LinuxLinux概述Linux特点Linux的各个发行版本Linux和Windows区别 Linux的下载和安装安装VMWare虚拟机和Centos安装Centos实现Linux的远程登录使用Xshell连接 Linux Linux概述 Linux内核最初只是由芬兰人林纳斯托瓦兹1991年在赫尔辛基大学上学时出于个人爱好而编写的。 …

会声会影2024出来了吗?

近年来&#xff0c;随着人们对于娱乐和创意的需求不断增长&#xff0c;视频编辑软件也越来越受到大众的关注。其中&#xff0c;会声会影是一款备受欢迎的视频编辑软件&#xff0c;许多用户都在关注其新版本——会声会影2024。 然而&#xff0c;目前并没有官方宣布会声会影2024的…

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人

一文速览深度伪造检测&#xff08;Detection of Deepfakes&#xff09;&#xff1a;未来技术的守门人 前言一、Deepfakes技术原理卷积神经网络&#xff08;CNN&#xff09;&#xff1a;细致的艺术学徒生成对抗网络&#xff08;GAN&#xff09;&#xff1a;画家与评审的双重角色…

车载电子电器架构 —— 车辆模式管理

车载电子电器架构 —— 车辆模式管理 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的…

Python算法题集_组合总和

Python算法题集_组合总和 题39&#xff1a;组合总和1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【值传递回溯】2) 改进版一【引用传递堆栈回溯】3) 改进版二【过程值列表缓存遍历后检索】 4. 最优算法5. 相关资源 本文为Python算法题集之一的…

JVM运行流程

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; JVM 1. 运行流程2. 运行时数据区2.1 堆&am…

【精品】集合list去重

示例一&#xff1a;对于简单类型&#xff0c;比如String public static void main(String[] args) {List<String> list new ArrayList< >();list.add("aaa");list.add("bbb");list.add("bbb");list.add("ccc");list.add(…

C++——模板详解

目录 模板 函数模板 显示实例化 类模板 模板特点 模板 模板&#xff0c;就是把一个本来只能对特定类型实现的代码&#xff0c;变成一个模板类型&#xff0c;这个模板类型能转换为任何内置类型&#xff0c;从而让程序员只需要实现一个模板&#xff0c;就能对不同的数据进行操…

4.2 数据的描述性统计

1、总体规模的描述——总量指标 定义&#xff1a;反映在一定时间、空间条件下某种现象的总体规模、总水平或总成果的统计指标。 eg&#xff1a;营业额、利润等 2、总体规模的描述——相对指标 定义&#xff1a;两个有相互联系的指标数值之比 eg&#xff1a;目标完成率&…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习&#xff0c;这种方法直接作用在图数据上&#xff0c;可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩&#xff0c;并且隐藏层…

计算机专业大学四年应该如何规划(Java方向)

计算机专业的学生&#xff0c;如何在大学四年内提高自己的竞争力&#xff0c;毕业之后直接进大厂工作&#xff1f; 以下将从大学四年计算机专业的学习规划、课程设置、能力提升、参考书籍等方面&#xff0c;为同学们提供一些建议和指导。 大一&#xff1a; 主攻技能学习并且达…

枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)

目录 一、枚举算法介绍 二、解空间的类型 三、循环枚举解空间 四、例题 &#xff08;一、反倍数&#xff09; &#xff08;二、特别数的和&#xff09; &#xff08;三、找到最多的数&#xff09; &#xff08;四、小蓝的漆房&#xff09; &#xff08;五、小蓝和小桥的…

Linpmem:一款功能强大的Linux物理内存提取工具

关于Linpmem Linpmem是一款功能强大的Linux物理内存提取工具&#xff0c;该工具专为x64 Linux设计&#xff0c;可以帮助广大研究人员在执行安全分析过程中快速读取Linux物理内存数据。 该工具类似Windows下的Winpmem&#xff0c;Linpmem不是一个传统的内存转储工具&#xff0…

scons,一个实用的 Python 构建工具!

目录 前言 什么是SCons库&#xff1f; 安装SCons库 使用SCons库 SCons库的功能特性 1. 基于Python的构建描述语言 2. 自动化依赖管理 3. 多种构建环境支持 SCons库的应用场景 1. C/C项目构建 2. Python项目构建 3. 嵌入式系统开发 4. 持续集成环境 5. 跨平台项目构建 总…

如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

【InternLM 实战营笔记】大模型评测

随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型&#xff0c;开辟了自然语言模型生成式预训练的路线。沿着这条路线&#xff0c;随后又陆续发布了GPT-2和GPT-3模型。与此同时&#xff0c;谷歌也…

Failed to build tree: parent link [base_link] of joint [lidar_joint] not found

参考&#xff1a; Failed to build tree: parent link [base_link] of joint 在古月居gazebo 的基础教程里&#xff0c;运行古月居的mbot的launch文件报错&#xff0c;小机器人不出现。 主要原因是提供的xacro文件的宏定义没有放在xacro的命名空间。 解决&#xff1a; 将<mb…