篮桥杯刷题第n天(dp更新)

news2025/7/16 5:28:05

最长上升子序列

输入:

10

1 4 5 1 4 1 9 1 9

输出:

4

算法思想:记录每个数为结尾的最长子序列长度,作为dp数组。

eg:(这个是以每个位置开头的记录最长的来穷举但核心仍为上述的算法思想)

初始序列为

穷举遍历所有组合

保留绿色部分(3,1,12,124,1246)以3,1,2,4,6结尾的最长子序列

落实到代码:

import java.util.*;
public class LIS {
	public static void main(String []args) {
		Scanner a = new Scanner(System.in);
		int n=a.nextInt();
		int []b = new int [n+1];
		int []f = new int [n+1];//开一个数组存以第i位置数字结尾的最长子序列
		//输入每个数并且将每个f[i]设置为1即本身
		for(int i =1;i<n+1;i++) {
			b[i]=a.nextInt();
			f[i]=1;
		}
		
		for(int i =1;i<n+1;i++) {
			for(int j=1;j<=i;j++) {
				//如果第j位置的数小于第i位置的可以在其基础上+1和本身比较更新dp
				if(b[j]<b[i]) {
					f[i]=Math.max(f[j]+1, f[i]);
				}
			}
		}
		int ans=0;
		//遍历一遍数组f找到最大的子序列长度
		for(int i =1;i<n+1;i++) {
			//System.out.print(f[i]+",");
			ans = Math.max(ans, f[i]);
		}
		System.out.println(ans);
	}
}

算法复杂度为O(n^2)两重for循环

优化:

因为核心就是要最后一个数越小越好且保持长度最长,这样后面方便延长长度(贪心思想)

算法思路保存长度为i,f[i]为最小的数的dp方便后面可以更新,由于序列有序固用二分查找去更新

eg:

10

3 1 2 4 6 5 3 4 5 6

前五个数遍历完

f为1 2 4 6

到第六个数(5)后会更新为

f = 1 2 4 5

再到第其七个数(3)后会更新为

f = 1 2 3 5

再第8(4)就是

f = 1 2 3 4 

最后就是直接插入5 6 

f = 1 2 3 4 5 6

ps:该核心主要在于只存储长度为i的序列的最小数字在f[i]中为dp状态方便后面可以更新,因为都是从左往右遍历固f是按从小到大顺序排放,后面数大于f最末尾可以直接插入,否则可以二分找到对应的pos位置看看能不能更新dp,len数组f长度即为最长的序列:

import java.util.Scanner;

public class LISplus {
	public static void main(String []args) {
		Scanner a = new Scanner(System.in);
		int n=a.nextInt();
		int []b = new int [n+1];
		int []f = new int [n+1];//开一个数组存目前结尾最小的长度为i的序列
		f[0]=0;//因为输入的数都为正整数所以设置初始数组0号位置为0最合适不过
		int len=0;
		for(int i =1;i<n+1;i++) {
			b[i] = a.nextInt();
			//如果当前输入的数大于最优序列的末尾的数说明可以直接插入
			if(b[i]>f[len]) {
				len++;
				f[len]=b[i];
			}
			//否则需要二分从中间开始找能不能有更优的插入位置
			else {
				int l=1,r=len;
				int mid,pos=0;//因为pos必不为0所以先设置一个默认值防止报错
				//二分当左边小于右边时就分
				while(l<=r) {
					mid =(l+r)/2;
					if(b[i]>f[mid]) {
						l=mid+1;
					}else {
						r=mid-1;//则半或者使l>r结束
						pos = mid;//该位置为可能可以替换的位置
					}
					
				}
				f[pos]=Math.min(f[pos], b[i]);
			}
		}
		System.out.println(len);
	}
}

再优化就是其实不需要存储输入的数组比较完就丢,只需要dp状态数组

import java.util.Scanner;

public class LISplus {
	public static void main(String []args) {
		Scanner a = new Scanner(System.in);
		int n=a.nextInt();
		//int []b = new int [n+1];
		int x;
		int []f = new int [n+1];//开一个数组存目前结尾最小的长度为i的序列
		f[0]=0;//因为输入的数都为正整数所以设置初始数组0号位置为0最合适不过
		int len=0;
		for(int i =1;i<n+1;i++) {
			x= a.nextInt();
			//如果当前输入的数大于最优序列的末尾的数说明可以直接插入
			if(x>f[len]) {
				len++;
				f[len]=x;
			}
			//否则需要二分从中间开始找能不能有更优的插入位置
			else {
				int l=1,r=len;
				int mid,pos=0;//因为pos必不为0所以先设置一个默认值防止报错
				//二分当左边小于右边时就分
				while(l<=r) {
					mid =(l+r)/2;
					if(x>f[mid]) {
						l=mid+1;
					}else {
						r=mid-1;//则半或者使l>r结束
						pos = mid;//该位置为可能可以替换的位置
					}
					
				}
				f[pos]=Math.min(f[pos], x);
			}
		}
		System.out.println(len);
	}
}

错误点:

每次编译运行run或者debug找不到源程序

一定要检查一下编辑版有没有问题

这里面漏其中一部分虽然不会报错但因为没有编辑版原因就会有上面情况(一直蠢了不知道这个才发现的)

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

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

相关文章

vue快速入门(一)vue的导入方法

注释很详细&#xff0c;直接上代码 新增内容 下载js代码导入实例数据绑定显示 源码 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

【解读Kubernetes架构】全面指南,带你掌握Kubernetes的设计原理与构成!

了解 Kubernetes 架构&#xff1a;综合指南 前言一、什么是 Kubernetes 架构&#xff1f;1.1、控制平面1.2、工作节点 二、Kubernetes 控制平面组件2.1、kube-api服务器2.2、etcd2.3、kube-scheduler2.4、Kube 控制器管理器2.5、云控制器管理器 &#xff08;CCM&#xff09; 三…

【HarmonyOS】ArkUI - 动画

利用属性动画、显示动画、组件转场动画实现组件动画效果。 一、属性动画 属性动画是通过设置组件的 animation 属性来给组件添加动画&#xff0c;当组件的 width、height、Opacity、backgroundColor、scale、rotate、translate 等属性变更时&#xff0c;可以实现渐变过渡效果。…

有人用GPT来做日内交易,居然赚钱了!但是……

在我们还在烦恼会不会被AI替代时&#xff0c;已经有人在教ChatGPT去炒股票了。 在近年ChatGPT火速出圈后&#xff0c;围绕AI能取代什么职业的讨论持续受到大众关注。 从事客服、编程、法律合规以及内容创作等行业人员最早感受到这股AI带来的寒意。 那ChatGPT能不能替代交易员…

Web APIs简介 Dom

JS的组成 API API 是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节 简单理解&#xff1a;API是给程序员提供的一种工具&#xff0c;以便能更轻松的实现…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法&#xff1a;将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突&#xff1a;不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突&#xff1a; 1. 开放寻址&#xff1a;产生哈希冲突后&…

刷题之Leetcode704题(超级详细)

704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&am…

【Apache Doris】周FAQ集锦:第 1 期

【Apache Doris】周FAQ集锦&#xff1a;第 1 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

【Java设计模式】序:设计模式总体概述

目录 什么是设计模式设计模式的分类1 创建型模式1.1. 单例&#xff08;Singleton&#xff09;1.2 原型&#xff08;Prototype&#xff09;1.3 工厂方法&#xff08;FactoryMethod&#xff09;1.4 抽象工厂&#xff08;AbstractFactory&#xff09;1.5 建造者&#xff08;Builde…

<网络安全>《71 微课堂<常见的国家级APT组织介绍>》

1 简介 国家级APT&#xff08;Advanced Persistent Threat&#xff0c;高级持续性威胁&#xff09;组织是有国家背景支持的顶尖黑客团伙&#xff0c;专注于针对特定目标进行长期的持续性网络攻击。 2 十大APT 2.1 NSA 美国国家安全局&#xff08;National Security Agency&a…

Redis面试题28道

1、什么是类加载器&#xff0c;类加载器有哪些&#xff1f; 1、什么是类加载器&#xff1f; 类加载器负责加载所有的类&#xff0c;其为所有被载入内存的类生成一个 java.lang.Class 实例对象。 2、类加载器有哪些&#xff1f; JVM 有三种类加载器&#xff1a; &#xff08…

基于GaN的半导体光学放大器SOA

摘要 基于GaN的材料可覆盖很宽的光谱范围&#xff0c;以紫外、紫、蓝、绿和红波发射的激光二极管已经商业化。基于GaN的半导体光学放大器&#xff08;SOA&#xff09;具有提高激光二极管输出功率的能力&#xff0c;因此SOA将有很多潜在应用。未来需要利用短波、超快脉冲特性的…

GD32F470_ADS1115 超小型 16位 模数转换器 ADC 4通道模块移植

2.9 ADS1115多路模数转换器 ADS1115 器件是兼容 IIC 的 16 位高精度低功耗模数转换器 (ADC)&#xff0c;采用超小型无引线 X2QFN-10 封装和 VSSOP-10 封装。ADS111x 器件采用了低漂移电压基准和振荡器。ADS1114 和 ADS1115 还采用可编程增益放大器(PGA)和数字比较器。这些特性加…

kali报错Unable to connect to remote host: No route to host,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

《搜广推算法指南》(2024版) 重磅发布!

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 结合…

全自动封箱机的工作原理:科技与效率的完美结合

随着科技的不断发展&#xff0c;越来越多的自动化设备走进了我们的日常生活和工业生产中。其中&#xff0c;全自动封箱机作为物流包装领域的重要一环&#xff0c;凭借其高效、精准的工作性能&#xff0c;正逐渐成为提升生产效率、降低劳动成本的得力助手。星派就来与大家深入探…

python调用java中的jar

一、基于IDEA生成可执行jar包 1、编写class的代码&#xff0c;注意一定要有main()方法才可以生成jar包&#xff0c;main()方法可以没有内容。例如下Java 代码&#xff1a; package Project;public class Demo {public static void main(String[] args){Demo t2 new Demo();S…

HarmonyOS(鸿蒙)——单击事件

2.4 实现ClickedListener接口并重写onClick方法 2.5 实现onClick方法中的具体逻辑&#xff0c;以此完成点击事件的相关业务操作 三、测试 3.1 登录远程模拟器 3.2 运行项目 四、精选好文 一、简介 1.1 什么是组件 组件就是文本、按钮、图片等元素的统称 1.2 什么是事件 …

NKCTF2024 re VM?VM!WP

逻辑似乎很简单&#xff08;个鬼啊&#xff09; 这个函数是把输入的字符转化为二进制并倒序存储 sub_1570太大了加载不出来&#xff0c;应该是加密的主逻辑&#xff0c;目的是需要输出1 可以通过删除栈的方法强行转化伪代码 首先删掉这部分 9A0改小点 这个也是 栈这里U一下再…

docker部署在线流程图

下载镜像 docker pull registry.cn-beijing.aliyuncs.com/wuxingge123/drawio:latestdocker-compose部署 vim docker-compose.yml version: 3 services:drawio:container_name: drawioimage: registry.cn-beijing.aliyuncs.com/wuxingge123/drawio:latestports:- 8083:8080v…