双向最长上升子序列

新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)(B,C,F) 链接:https://www.nowcoder.com/acm/contest/116/B来源:牛客网时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld题目描述杨老师给同学们玩个游戏,要求使用乘法和减法来表示一个数,他给大家9张卡片,然后报出一个数字,要求大家用表达式的形式来表示出这个数 100 可以表示为这... 阅读详情

问题:

从一列不重复的数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。

Input :

输入第一行为用例个数, 每个测试用例输入是一个数组,数值通过空格隔开。

Output:

输出筛选之后的数组,用空格隔开。如果有多种结果,则一行一种结果, 单个输入的所有结果按从小到大排序,排序的key的优先级随index递增而递减 例如 3 4 7 6; 1 3 7 5; 1 2 7 6; 1 3 7 6 排序成 1 2 7 6;1 3 7 5;1 3 7 6; 3 4 7 6; 

Sample Input :

4
1 2 4 7 11 10 9 15 3 5 8 6
1 3 5 4 7 6 4 5 3
1 2 3
3 2 1

 Sample Output:

1 2 4 7 11 10 9 8 6
1 3 4 7 6 4 3
1 3 4 7 6 5 3
1 3 5 7 6 4 3
1 3 5 7 6 5 3
1 2 3
3 2 1

解题思路:

最长序列长度:

首先求数组从左到右,以 i 结尾的最长递增子序列 LIS,再求数组从右到左,以 i 结尾的最长递增子序列 LDS,对每个位置的 i ,序列的最长长度为 LIS[i] + LDS[i] - 1 ,求出最长序列长度。

输出每个序列结果:

对每个位置的序列长度进行遍历,将每个最大序列长度 i 的位置 记录到 maxIndex中。再对maxIndex中每个位置进行遍历,分别求出列表中该元素的前缀和后缀,组成一组答案,最终遍历完成,对答案进行去重,排序,输出。

求前缀与后缀过程:

假设列表为arr,当前maxIndex = i , 则前缀最长上升子序列长度为front = 1、2、3、...、LIS[i] - 1,对这些长度倒序遍历,找出列表中 i 之前满足LIS[j] = front的位置 j,将同一 front 下的所有满足条件的位置 j 放入列表中,后对当前结果序列进行遍历,如最初结果序列中只有 11 一个元素,取得结果序列中首部的元素,如"7 11"的结果序列中,首部元素first_num = 7,若arr[j] < first 并且 j < arr.indexof(7),即当前位置的元素比结果序列中首部元素要小,并且该元素的索引,在首部元素索引的前面,则,string = arr[j] + " " + string,即将当前位置的元素加入到结果序列中。不断循环,直至求出所有前缀。

求后缀的过程与求前缀的过程基本类似。

参考代码(JAVA):

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;


public class Main5 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int cases = Integer.parseInt(sc.nextLine());
		for(int i = 0; i < cases ; i++) {
			String str1 = sc.nextLine();
			String[] str3 = str1.split(" ");
			int n = str3.length;
			ArrayList<Integer> arr = new ArrayList<Integer>();
			for(int j = 0; j < str3.length; j++){
				arr.add(Integer.parseInt(str3[j]));
			}
			int[] LIS = getLIS(arr,n);
			int[] LDS = getLDS(arr,n);
			
			ArrayList<Integer> maxIndex = new ArrayList<Integer>();
			int[] lengthArr = getLengthAndMaxLength(LIS,LDS,n);
			int maxLength = lengthArr[lengthArr.length-1];
			for (int j = 0; j < n; j++) {
				if(lengthArr[j] == maxLength) {
					maxIndex.add(j);
				}
			}
//			System.out.println(maxLength);
			ArrayList<String> output = getOutPut(arr,lengthArr,n,maxIndex,LIS,LDS);
			output = getUniqueOutput(output);
			for (String string : output) {
				System.out.println(string);
			}
			
		}
	}
	
	
	
	private static ArrayList<String> getUniqueOutput(List<String> output) {
		// TODO Auto-generated method stub
		Set<String> s = new HashSet<>();
		s.addAll(output);
		ArrayList<String> unique = new ArrayList<String>();
		unique.addAll(s);
		Collections.sort(unique);
		return unique;
	}



	private static ArrayList<String> getOutPut(ArrayList<Integer> arr, int[] lengthArr, int n,
			ArrayList<Integer> maxIndex, int[] LIS, int[] LDS) {
		
		ArrayList<String> output = new ArrayList<String>();
		for (Integer i : maxIndex) {
			int front = LIS[i] - 1;
			ArrayList<String> sFront = new ArrayList<String>();
			sFront.add(arr.get(i)+"");
			while(front > 0) {
				ArrayList<Integer> index = new ArrayList<Integer>();
				for (int j = 0; j < i; j++) {
					if(LIS[j] == front) {
						index.add(j);
					}
				}
				if(!index.isEmpty()) {
					sFront = addFirst(sFront,arr,index);
				}
				front--;
			}
			int after = LDS[i] - 1;
			while(after > 0) {
				ArrayList<Integer> index = new ArrayList<Integer>();
				for (int j = i + 1; j < n; j++) {
					if(LDS[j] == after) {
						index.add(j);
					}
				}
				if(!index.isEmpty()) {
					sFront = addAfter(sFront,arr,index);
				}
				after--;
			}
			output.addAll(sFront);
		}
		return output;
	}

	private static ArrayList<String> addAfter(ArrayList<String> str,
			ArrayList<Integer> arr, ArrayList<Integer> pos) {
		ArrayList<String> s = new ArrayList<String>();
		for (Integer index : pos) {
			if(!str.isEmpty()) {
				for (String string : str) {
					int last_num = Integer.parseInt(string.split(" ")[string.split(" ").length - 1]);
					if(arr.get(index) < last_num && index > arr.lastIndexOf(last_num)) {
						string = string + " " + arr.get(index);
						s.add(string);
					}	
				}
			}else {
				s.add(arr.get(index)+"");
			}
		}
		return s;	
	}



	private static ArrayList<String> addFirst(ArrayList<String> str, ArrayList<Integer> arr, ArrayList<Integer> pos) {
		
		ArrayList<String> s = new ArrayList<String>();
		for (Integer index : pos) {
			if(!str.isEmpty()) {
				for (String string : str) {
					int first_num = Integer.parseInt(string.split(" ")[0]);
//					System.out.println(first_num +"  "+ arr.indexOf(first_num));
					if(arr.get(index) < first_num && index < arr.indexOf(first_num)) {
						string = arr.get(index) + " " + string;
						s.add(string);
					}	
				}
			}else {
				s.add(arr.get(index) + "");
			}
		}
		return s;	
	}



	private static int[] getLengthAndMaxLength(int[] LIS,int[] LDS,int n) {
		int maxLength = 0;
		int[] lengthArr = new int[n + 10];
		for (int j = 0; j < n; j++) {
			int length = LIS[j] + LDS[j] - 1;
			lengthArr[j] = length;
			if(length > maxLength) {
				maxLength = length;
			}
		}
		lengthArr[lengthArr.length - 1] = maxLength;
		return lengthArr;
	}
	//获取以0为起点,以i为终点的最长递增子序列
	public static int[] getLIS(ArrayList<Integer> arr, int n) {
		int[] LIS = new int[n+10];
		Arrays.fill(LIS, 1);
		for (int i = 1; i < arr.size(); i++) {
			for (int j = 0; j < i; j++) {
				if(arr.get(j) < arr.get(i)) {
					LIS[i] = Math.max(LIS[i], LIS[j] + 1);
				}
			}
		}
		return LIS;
	}
	//获取以i为起点,以n为终点的最长递减子序列
	public static int[] getLDS(ArrayList<Integer> arr, int n) {
		int[] LDS = new int[n+10];
		Arrays.fill(LDS, 1);
		for (int i = n - 2; i >= 0; i--) {
			for (int j = i + 1; j < n; j++) {
				if(arr.get(j) < arr.get(i)) {
					LDS[i] = Math.max(LDS[i], LDS[j] + 1);
				}
			}
		}
		return LDS;
	}
}

如有错误,请指正。

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题 在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。 阅读详情

相关推荐

PLC编程进阶:结构体(UDT)与功能块(FB)的模块化实践指南

本文深入探讨了PLC编程中实现模块化的核心方法,重点解析了结构体(UDT)与功能块(FB)的协同应用。通过将零散数据封装为UDT,并将控制逻辑打包为可复用的FB,能够构建出结构清晰、易于维护和调试的PLC程序。文章结合拧紧枪、电机控制等实战案例,提供了从设计原则到分层架构的完整实践指南,旨在帮助工程师将混乱的‘面条式’代码改造为高效的‘正规军’。

s3t4u的博客 221

求最长上升子序列长度和输出序列

最长上升子序列 求最长上升子序列,并输出最长子序列。此文解释两种方法,dp和二分算法。并详细解释了输出最长子序列的过程。且代码精短易懂

卖炫迈的小男孩的博客 1万+

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4942

动态规划专题之最长上升子序列

专题四:最长上升子序列/*       Name:动态规划专题之最长上升子序列       Author:巧若拙        Description:1759_最长上升子序列描述:一个数的序列bi,当b1 &lt; b2 &lt; ... &lt; bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2,..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., ...

QiaoRuoZhuo的专栏 599

树莓派部署Home Assistant:打造本地化智能家居大脑

家庭自动化旨在通过技术提升居住便利性与舒适度,其核心在于中枢控制系统对各类设备的统一调度。传统云端方案虽部署简便,但存在隐私泄露、网络依赖与生态壁垒等固有缺陷。本地化部署通过将控制逻辑与数据存储于家庭内部网络,从根本上解决了这些问题,实现了数据自主、离线可用与跨品牌联动。Home Assistant作为领先的开源家庭自动化平台,结合树莓派这一低功耗、高性价比的硬件载体,为构建私有、可靠的智能家居中枢提供了成熟方案。本文以树莓派4B为例,详细阐述了从系统安装、设备集成到自动化场景创建的完整实践流程,并深入探讨

weixin_33501543的博客 374

Java数据可视化实战:基于JFreeChart的数学函数绘图工具开发

JFreeChart是一个开源的Java图表库,适用于Swing和JavaFX应用程序。折线图和面积图柱状图和饼图散点图和气泡图组合图表3D图表等实现自定义数学表达式解析:java复制下载throw new IllegalArgumentException("表达式不能为空");// 验证表达式try {}");throw new IllegalArgumentException("无效的数学表达式: " + e.getMessage());try {

2201_76125393的博客 365

11.最长上升子序列(LIS)

线性DP

weixin_60869516的博客 2077

OpenClaw一人公司落地案例:本地商家营销智能体月赚3万的秘密

角色:本地商家营销专家## 核心目标为商家生成高转化率的抖音营销策略,最大化 ROI。## 输入数据- 商家名称: "XX奶茶店"- 过去 30 天视频播放量: 12,000- 客单价: 28 元- 竞品平均播放量: 15,000- 市场趋势: rising## 策略生成规则1. **内容类型**:根据客单价推荐- < 30 元:美食探店 + 优惠券- > 30 元:场景化故事 + 会员权益2. **发布时间**:根据历史数据- 18:00-20:00 高峰期。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 542

最长上升子序列(线性dp+输出选了哪些数的方法)

最长上升子序列 如果a 1 < a 2 < … < a N,则a i 的数字序列是有序的。令给定数字序列 ( a 1 , a 2 , …, a N ) 的子序列为任意序列 ( a i 1 , a i 2 , …, a i K ),其中 1 <= i 1 < i 2 < … < i K <= N. 例如,序列 (1, 7, 3, 5, 9, 4, 8) 具有有序子序列,例如 (1, 7), (3, 4, 8) 和许多其他子序列。所有最长的有序子序列的长度为 4,

weixin_53158895的博客 321

Carla中如何渲染opendrive车道线和车道标识(全网独家,附代码)

carla是可以单独加载opendrive并渲染路面的,但是无法把车道线渲染出来,这是一个大坑,因为没有车道线就无法给感知输入。楼主已经实现,直接渲染车道线或者带PBR贴图的车道标识。实现起来非常简单,但必须对carla源码以及ue的开发足够了解。在carla源码中有一个很重要的类opendrivegenerator,它是关于opendrive渲染的全部方法,但是你是找不到它实例化的地方的,因为它被定义在蓝图关卡中。网上包括carla官方关于carla源码的分析少之又少,楼主将自己的经验写出来供大家参考。

u013998156的博客 1090

【系统分析师】2026年上半年真题:论文及解题思路

四篇论文围绕系统与开发实践展开: 安全架构设计强调数据加密(国密算法)、零信任访问控制及容灾架构,以某医疗云平台为例,实现RTO<5分钟的高可用保障。 架构风格应用解析微服务/事件驱动等风格选型,结合电商平台案例,通过服务拆分与异步通信提升扩展性。 需求评审机制提出正式评审与走查结合的方法,在金融系统中减少30%返工,解决业务规则二义性问题。 LLM测试生成利用大模型从需求/代码生成用例,辅以人工校验,使测试效率提升50%,覆盖边缘场景。 各篇均遵循“背景-理论-实践”结构,突出

数据知道的博客 783

最长上升子序列(序列长度+序列输出)

一、LIS的定义: 最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中是否可以有相等的数。假设我们有一个序列 b i,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们也可以从中得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N,但必

时光、疏离了记忆づ童话的博客 9219

【离线OCR】微信离线实现图片OCR文本和表格识别

基于微信本地OCR引擎(由最新版微信自动安装)。通过Python对其官方调用逻辑进行完整翻译和封装,使开发者可以用简单的API调用其强大的OCR功能。

专注于医院数据分析技术与系统开发的创作与分享。 2624

最长上升子序列模型

上升子序列

m0_72747430的博客 805

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

upperbound双向求最长上升子序列加最长下降子序列

该序列为:最长上升子序列 + 最长下降子序列 1 3 4 5 2 1 #include<bits/stdc++.h> using namespace std; int dp1[500010],dp2[500010],d1[500010],d2[500010],a[500010],n; void my_solve() { int s=0; fill(dp1,dp1+n,INT_MAX); fill(dp2,dp2+n,INT_MAX); for(int

林黛玉到拔垂杨柳的博客 244

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

AcWing 1017. 怪盗基德的滑翔翼 双向最长上升子序列

AcWing 1017. 怪盗基德的滑翔翼 怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。 而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。 不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。 初始时,怪盗基德可以在任何一幢建筑的顶端。 他可以选择

qq_52358098的博客 175

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Luogu P1091 合唱队形

原题传送门 #include &lt;bits/stdc++.h&gt; using namespace std; int n; int a[105];//身高序列 int head_to_tail[105];//方向从头到尾,到第i个为止,包含第i个在内,a[]的最长上升子序列(非连续)的长度 int tail_to_head[105];//方向从尾到头,到第i个为止,包含第i个在内,a[]的...

Sophon 195

华为机试|HJ24 合唱队

双向LIS,枚举每一个点的答案,选择出最优答案(答案要求删去的人最少,反过来就是合唱队的人数最多,由于LIS包含自身,所以双向LIS加起来后要多扣掉一个重复的自己)

Fangyechy的博客 486

AcWing 482. 合唱队形【动态规划】【线性DP】【最长上升子序列】

动态规划 线性DP 最长上升子序列

Derrickhang的博客 415

动态规划-最长上升子序列问题

本文介绍了最长上升子序列(LIS)的动态规划解法及其应用。首先定义LIS问题,即找到无序整数数组中最长的严格递增子序列长度。通过O(n²)的动态规划算法,使用dp[i]表示以nums[i]结尾的最长子序列长度,遍历比较前序元素进行状态转移。随后以合唱队形问题为例,将其转换为LIS问题求解:计算每个位置作为峰顶时,左侧的递增序列长度f[i]和右侧递减序列长度g[i](等价于反向递增),最终最少出列人数为n-max(f[i]+g[i]-1)。文中提供了完整代码实现和详细思路分析,展示了LIS问题的典型应用场景。

zephyr05的博客 414

最长上升子序列(acwing 895 acwing 896 acwing1017)

最长上升子序列

一起刷题一起进步昂 498

动态规划之最长上升子序列模型

## LIS问题及其应用 模板 #include<iostream> #include<algorithm> using namespace std; int n; const int MAX=1010; int a[MAX]; int dp[MAX]; int main(){ cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; for (int i=1;i<=n;i++){ ...

qq_47188574的博客 230

caioj 1065 动态规划入门(一维一边推3:合唱队形)

就是最长上升子序列,但是要用n^2的算法。 #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namespace std; const int MAXN = 1123; int a[MAXN]...

weixin_34148340的博客 112

joj 2529

最长上升子序列    #include using namespace std; int main() {  int a[110], u[110], d[110];  int n, i, j, m;  while ( cin >> n )  {   for( i = 0; i   {    cin >> a[i];   } /*  for( i = 0; i

201

题解 P1091 【合唱队形】洛谷

这道题相信各位都是用了常见的动态规划模板,最长上升子序列,本蒟蒻对着样的解法写出了2个版本,第二个有了微乎其微的优化,时间更少。首先一个最长上升子序列双向,然后各种凑求最大值。伪代码来一发(中文,类似于《算法导论》)for i=1到n for j=0到i-1 如果a[i]&gt;a[j] 那么f[i]=较大(f[i],f[j]+1); //f维护动态规划。 再来一个从后往前...

Calix_Guo的博客 415

最长上升子序列c语言二分,动态规划之最长上升子序列模型

动态规划分为很多模型,比如说数字三角形模型,最长上升子序列模型,背包模型,状态机模型,状态压缩,区间dp,树形dp等等下面,我就Acwing提高课中,最长上升子序列模型进行了整理。涉及知识点总览主要涉及的算法知识点有:最长上升子序列 O(N2)O(N^2)O(N2)和O(NlogN)O(NlogN)O(NlogN)求解方法正反双向 LIS最大上升子序列和偏序集-Dilworth定理的两种证明这里补...

weixin_42697609的博客 380
上一篇: 调整数组使得两个数组和的差最小
下一篇: 取模运算
buger_maker
博客等级 码龄10年 648粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值