最长上升子序列(线性dp)-java

news2024/11/22 23:20:20

主要是解决最长上升子序列问题,推出状态转移方程。

文章目录

前言

一、最长上升子序列问题

二、算法思路

1.最长上升子序列思路

三、代码如下

1.代码如下(示例):

2.读入数据

3.代码运行结果

总结


前言

主要是解决最长上升子序列问题,推出状态转移方程。


提示:以下是本篇文章正文内容,下面案例可供参考

一、最长上升子序列问题

给定一个长度为 N的数列,求数值严格单调递增的子序列的长度最长是多少。

比如我们给定一个数列:

7
3 1 2 1 8 5 6

它的最长上升子序列就是4(即 1 2 5 6) 

二、算法思路

1.最长上升子序列思路

我们引入一个arr数组和一个dp数组,arr数组用来存储输入的数列,dp[i]表示的含义就是以第i个数为结尾的上升子序列的长度最大值。

那么当arr[i]>arr[j]时:

dp[i] = max(dp[j]+1) j = 0,1,2,3...i-1

dp数组代码:

        for(int i = 1;i <= n;i++) {
			//dp的默认值是1,数字本身算上升子序列中的一位
			dp[i] = 1;
			for(int j = 1;j <= i;j++) {
				if(arr[j] < arr[i]) {
					dp[i] = Math.max(dp[i],dp[j]+1);
				}
			}
		}

 以上述数列为例,它的dp数组如下:

1 1 2 1 3 3 4 

三、代码如下

1.代码如下(示例):


import java.io.*;
public class 最长上升子序列 {
	static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	public static void main(String[] args) throws Exception{
		int n = nextInt();
		int[] arr = new int[1010];
		for(int i = 1; i <= n;i++) {
			arr[i] = nextInt();
		}
		int[] dp = new int[1010];
		for(int i = 1;i <= n;i++) {
			//dp的默认值是1,数字本身算上升子序列中的一位
			dp[i] = 1;
			for(int j = 1;j <= i;j++) {
				if(arr[j] < arr[i]) {
					dp[i] = Math.max(dp[i],dp[j]+1);
				}
			}
		}
		int res = 0;
		for(int i = 1;i <= n;i++) {
			res = Math.max(res, dp[i]);
		}
		pw.println(res);
		pw.flush();
	}
	public static int nextInt()throws Exception {
		st.nextToken();
		return (int)st.nval;
	}
	public static long nextLong()throws Exception {
		st.nextToken();
		return (long)st.nval;
	}
	public static String nextLine()throws Exception {
		return br.readLine();
	}
}

2.读入数据

代码如下(示例):

7
3 1 2 1 8 5 6

3.代码运行结果

4

最长上升子序列是 :1、2、5、6。长度是4


总结

最长上升子序列我们主要从dp数组中找出状态转移方程即可。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三相交流电子负载的基础认识

三相交流电子负载主要用于电源、电机、逆变器等产品的测试和老化&#xff0c;它能够精确地模拟各种负载的工作状态&#xff0c;如阻性、感性、容性等&#xff0c;以满足不同产品的测试需求。三相交流电子负载具有响应速度快、精度高、稳定性好等特点&#xff0c;是现代电力电子…

6款超好用AI写作神器,写作效率秒拔高! #经验分享#人工智能#知识分享

在当今信息爆炸的时代&#xff0c;写作成为了人们表达思想、分享知识和传递情感的重要方式之一。对于很多人来说&#xff0c;写作并非易事。我们会陷入困境&#xff0c;无法找到灵感&#xff0c;我们会苦恼于语言表达的准确性&#xff0c;还有时候我们可能遭遇到了创作瓶颈&…

功耗低、触控灵敏度高、抗干扰能力强等众多优势,输出方式多样的单键电容式触控芯片TS223B介绍

•应用领域• 适用于小家电、电子玩具、智能物联网等各种触控产品方案。 •功能介绍• 单键电容式触控芯片TS223B具有功耗低、触控灵敏度高、抗干扰能力强等众多优势&#xff0c;输出方式包括直接输出、电平翻转输出&#xff0c;并且输出的初始状态可以配置&#xff0c;能灵活满…

UVA12538 Version Controlled IDE 题解 crope

Version Controlled IDE 传送门 题面翻译 维护一种数据结构&#xff0c;资磁三种操作。 1.在p位置插入一个字符串s 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 1 ≤ n ≤ 50000 1 \leq n \leq 50000 1≤n≤50000&#xff0c;所…

Spring声明式事务(Spring学习笔记十三)

不推荐使用编程式事务 在Spring-dao.xml中配置声明式事务 <!--配置声明式事务 --><!--获得transactionManager然后把他丢给他的构造器 constructor-arg --><bean id"transactionManager" class"org.springframework.jdbc.datasource.Data…

网站压力测试和Locust

一、压力测试介绍 网站压力测试是一种评估网站性能、可靠性和稳定性的方法。它通过模拟大量用户同时访问网站,来测试网站的响应时间、吞吐量、资源利用率等指标,从而发现网站的潜在问题和瓶颈。下面我将从几个方面详细介绍网站压力测试: 1、压力测试的目的 评估网站在高并发…

Midjourney该怎么用?从零基础到落地实践

前言 从注册登录到基本的操作界面&#xff0c;提示词组成后缀介绍&#xff0c;到主流的生成图片的方式&#xff0c;以及最重要的提示词咒语分享&#xff0c;还有一些我的使用心得&#xff0c;希望对大家有帮助&#xff01; 喜欢的话欢迎关注我&#xff0c;欢迎点赞收藏评论&am…

如何运用工业智能网关将数据上传到设备数字化平台

在数字化浪潮的推动下&#xff0c;工业领域正迎来前所未有的变革。工业智能网关作为连接物理世界与数字世界的桥梁&#xff0c;其在数据采集、传输和处理方面发挥着不可或缺的作用。而HiWoo Cloud平台&#xff0c;正是利用工业智能网关&#xff0c;实现设备数据数字化管理的强大…

RTThread studio 驱动开发

rtthread 驱动开发的两种情况 rtthread studio 自动生成 由 RT Thread Studio 自动生成&#xff0c;无需修改任何文件或者简单定义几个宏即可直接使用的驱动&#xff0c;如 GPIO&#xff0c;UART&#xff0c;I2C&#xff0c;SPI&#xff0c;SDIO 和 ETH 等。 使用 RT-Thread S…

Flowise AI工作流本地部署实战教程

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

axure谷歌插件(直接下载)

axure谷歌插件 在网上找一个谷歌的axure&#xff0c;不是登陆就是收费&#xff0c;离谱。找了好久才找到这个&#xff0c;我下载保存到网盘了&#xff0c;直接下载就ok&#xff0c;永久无提取码。 下载插件文件&#xff0c;打开开发者模式&#xff0c;直接拖进来就ok。 网盘…

网络安全行业现在还能入吗?

这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入行业&#xff0c;能享受行业发展红利。…

【Linux 命令】内核、驱动调试手段总结

文章目录 1. printk2. strace3. Itrace4. ptrace5. ftrace6. 动态打印7. perf8. devmem9. demsg参考&#xff1a; 1. printk **printk()**是 Linux 内核中最广为人知的函数之一。它是我们打印消息的标准工具&#xff0c;通常也是追踪和调试的最基本方法。 虽然 printk() 是基…

【网站项目】新冠疫苗预约小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

(学习日记)2024.04.10:UCOSIII第三十八节:事件实验

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Adobe Photoshop 2024 v25.6 (macOS, Windows) - 照片和设计软件

Adobe Photoshop 2024 v25.6 (macOS, Windows) - 照片和设计软件 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD …

《C语言深度解剖》(3):探索函数递归、传值、传址调用的奥秘

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&am…

DC-DC芯片D1509适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是芯谷科技推出的一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片&#xff0c;其输出电压有固定3.3V、5.0V和12.0V的版本&#xff…

Ngnix常用配置及和基本功能讲解

Nginx已经广泛应用于J-one和Jdos的环境部署上&#xff0c;本文对Nginx的常用的配置和基本功能进行讲解&#xff0c;适合Nginx入门学习。 1 核心配置 找到Nginx安装目录下的conf目录下nginx.conf文件&#xff0c;Nginx的基本功能配置是由它提供的。 1.1 配置文件结构 Nginx的…

深入C语言内存:数据在内存中的存储

一、数据类型 1. unsigned&#xff1a;无符号数类型 当一个数是无符号类型时&#xff0c;那么其最高位的1或0&#xff0c;和其它位一样&#xff0c;用来表示该数的大小。 2.signed&#xff1a;有符号数类型 当一个数是有符号类型时&#xff0c;最高数称为“符号位”。符号位为1…