求最长单调子序列java,单调减子序列(java实现)

题目:从一个由N个整数排列组成的整数序列中,自左向右不连续的选出一组整数,可以组成一个单调减小的子序列(如从{68 69 54 64 68 64 70 67 78 62 98 87}中我们可以选取出{69 68 64 62}这个子序列;当然,这里还有很多其他符合条件的子序列)。给定整数序列的长度和整数序列中依次的值,请你求出这个整数序列中“最长的单调减小的子序列的长度”以及“不同但长度都是最长得单调减小的子序列的数量”。

输入第1行为一个整数N,表示输入的整数序列的长度(1≤N≤50000)。输入第2行包括由空格分隔的N个整数(每个整数都在32位长整型范围内)。

输出包括一行,为两个数字,分别为针对给定的整数序列求出的“最长的单调减小的子序列的长度”以及“值不同但长度都是最长得单调减小的子序列的数量”

样例输入

12

68 69 54 64 68 64 70 67 78 62 98 87

样例输出

4 2

对于这个题,一共有两个小部分的问题要解决。前一个问题是最长不上升子序列,属于LIS问题,使用动态规划解决,后一个问题属于去重问题。

对于LIS问题,声明dp[i] 以第i个元素为结尾的子序列的最长的长度。

对第i个元素,与前i-1个元素进行比较:

dp[i] = 1; //当末尾只要一个元素时 长度为1

如果 arr[i] < arr[j]:

如果dp[i] < dp[j] + 1

此时dp[i]的值会被更新为dp[j] + 1

其他情况不做处理

对于去重问题:

“值不同但长度都是最长得单调减小的子序列的数量” 这里说的是:

比如输入:

6

2 1 2 1 2 1

输出应为 2 1

2 1 2 1 这两个是值相同的,所以应该当做一个

使用size[i] 数组去记录第i元素为结尾时,值不同但长度都是最长得单调减小的子序列的数量

每次在dp更新一遍以后,进行size的更新。

去掉相同值的情况,如果只去关注最后结尾时:

因为每次遍历都会更新状态,也就是说如果有相同值的时候 后者会把前者的情况 都会过一遍,所以只要每次更新时保证只取相同值的最后一个出现的元素位置的size[j]即可,也就是最右边的那个。

对于i元素所构成的最长子序列的前一个元素可能有很多不同值,所以要记录这些值,并只取最右边的。

最后size 和 dp都已经生成了最终数组

然后对整个数组进行遍历, 找出最大序列 且值不同的序列的数量

方法同找单个i位置元素的值不同但长度都是最长得单调减小的子序列的数量 一致

其他说明:

数据较大 使用java中的BigInteger

遍历找值不同但长度都是最长得单调减小的子序列的数量时 使用倒序查找

代码:

Scanner read = new Scanner(System.in);

int n = read.nextInt();

long[] arr = new long[n];

long[] dp = new long[n];

BigInteger[] size = new BigInteger[n];

for(int i = 0; i < n; ++i){

arr[i] = read.nextLong();

}

long max = 0;

for(int i = 0; i < n; ++i){

dp[i] = 1;

size[i] = new BigInteger("0");

for(int j = 0; j < i; ++j){

if(arr[j] > arr[i]){

if(dp[j] + 1 > dp[i]){

dp[i] = dp[j] + 1;

}

}

}

if(dp[i] > max){

//更新 最长长度

max = dp[i];

}

// 确定以arr[i]结尾的 子序列中 值不同但长度都是最长得单调减小的子序列的数量

if(dp[i] > 1){//如果 不是只有一个数字的时候

Set sl = new HashSet<>();

for(int j = i - 1; j >= 0; --j){

//从右向左查询 只查询第一次遇到的并且是最大长度的 size[i]

// 没有记录路径 通过 arr[j] > arr[i] && dp[j] == dp[i] - 1 来确定是否是前一个转移

// 遇到相同结尾的情况,更右边的已经包含了左边的情况

if(arr[j] > arr[i] && dp[j] == dp[i] - 1 && !sl.contains(arr[j])){

sl.add(arr[j]);//去重

size[i] = size[i].add(size[j]);

}

}

}else{

//只有一个数字是 数量为1

size[i] = new BigInteger("1");

}

}

BigInteger maxBigI = new BigInteger("0");

Set set = new HashSet<>();

//遍历整个序列 找出最大长度 且值不同的序列的数量

for(int i = n - 1; i >= 0; --i){

if(dp[i] == max && !set.contains(arr[i])){

set.add(arr[i]);

maxBigI = maxBigI.add(size[i]);

}

}

System.out.println(max + " " + maxBigI.toString());

}

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

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

相关文章

php输出12个月,php获取12个月内的开始时间和结束时间

$currentTime time();$cyear floor(date("Y",$currentTime));$cMonth floor(date("m",$currentTime));for($i0;$i<6;$i){$nMonth $cMonth-$i;$cyear $nMonth 0 ? ($cyear-1) : $cyear;$nMonth $nMonth < 0 ? 12$nMonth : $nMonth;$date $c…

java打开输入框,java – 在Android中打开输入对话框

我想在某个点打开一个输入对话框,我可以在其输入后存储和使用它.我在互联网上找到的所有例子都非常先进,我想它们并不像我想要的那样简单 – 我只需要类似于Java的东西&#xff1a;String name JOptionPane.showInputDialog("Enter your name");保留输入以供以后计算…

php 编译原理,编译原理

编译原理是计算机科学中历史最悠久&#xff0c;也是最高度发展的学科之一。编译器的设计与实现集中体现了计算机科学中的最核心的思想和技术&#xff0c;并且和计算机科学的其他研究领域&#xff0c;如形式语言与自动机、算法、数据结构、程序设计语言、计算机体系结构、软件工…

java俄文xml解析错误,XML解析出错处理

搜索热词正常解析完毕之后会直接走parserDidEndDocument这个方法解析出错之后会执行一个相应的方法&#xff0c;- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError&#xff0c;执行完毕此方法后.会根据解析出错的地方去执行方法parserDidEndDocume…

JAVA中自己写的util中的chop,Java StringUtils.chop方法代碼示例

import org.apache.commons.lang3.StringUtils; //導入方法依賴的package包/類/*** Tutti i file dentro a /res vengono indicati come cacheabili lato browser per 1 anno (tramite lheader expires).* Per evitare che nuove versioni non vengano mai prese, si usa il &q…

ascii码扩展 php,php与ascii码

首先 简单说一下历史&#xff0c;ascii码最开始是美国人搞出来的&#xff0c;用来干什么呢&#xff1f;我们知道&#xff0c;计算机只知道0和1&#xff0c;如果我们要计算机识别除了01之外的字符&#xff0c;例如 a&#xff0c;我们要先告诉计算机‘1100001’就是a。跟摩斯密码…

php手机电子相册,免费电子相册制作软件 手机电子相册制作软件

照片配上音乐加上炫酷的过渡效果点缀图片和文字说明&#xff0c;轻松制作成各种视频格式的电子相册。不需要专业的视频制作知识&#xff0c;点几下鼠标就可以把上百张数码照片制作成电子相册。视频相册可以在电脑上用播放器收看或者在高清电视上播放。也可以刻录成DVD、VCD光盘…

windows上配置nginx php,Windows下配置Nginx使之支持PHP

1. 首先&#xff0c;将 nginx.conf 中的 PHP 配置注释去掉。01# pass the PHP scripts to FastCGI server listening on 127.0.0.1:900002#03#location ~ .php$ {04# root html;05# fastcgi_pass 127.0.0.1:9000;06# fastcgi_index index.php;07# fas…

php 系统环境变量引用,PHP 系统变量 环境变量

在PHP网站开发中&#xff0c;为了满足网站的需要&#xff0c;时常需要对PHP环境变量进行设置和应用&#xff0c;在虚拟主机环境下&#xff0c;有时我们更需要通过PHP环境变量操作函 数来对PHP环境变量值进行设置。为此我们有必要对PHP环境变量先有所熟悉。今天和大家分享PHP环境…

python dataframe分组求和,pandas datafram中按特定月份分组和求和值

这里有一个稍微不同的方法&#xff1a;使用year和month来构建索引&#xff0c;然后使用一个UDF groupby()。在示例数据&#xff1a;N 10years pd.date_range("1981", "2017", freq"A").yeardates np.random.choice(years, sizeN, replaceTrue…

matlab7.0 run,新手求救啊!!!matlab7.0在win7启动后命令窗口出现大段代码!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼java.lang.NoClassDefFoundError: com/mathworks/beans/ExtraPropertyAttributesat java.lang.ClassLoader.defineClass0(Native Method)at java.lang.ClassLoader.defineClass(Unknown Source)at java.security.SecureClassLoader…

php+spl+栈,PHP SPL标准库之数据结构栈(SplStack)介绍

栈(Stack)是一种特殊的线性表&#xff0c;因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈)SplStack就是继承双链表(SplDoublyLinkedList)实现栈。类摘要如下&#xff1a;简单使用如下&#xff1a;//把栈想象成一个颠倒的数组$stack new SplStack();/*** 可见栈和双…

深度理解java jvm,深度理解JVM

深入理解java虚拟机要讲的内容了解历史垃圾回收机制性能监控工具性能调优案例实战认识类的文件结构类加载机制字节码执行引擎虚拟机编译及运行时优化Java线程高级1. 环境搭建安装jdk2. 内存溢出场景模拟public class Test01 {public static void main(String[] args) {//测试内…

php用json_encode编码后乱码,php json_encode()函数中文编码乱码解决方法_PHP教程

在我使用php json_encode()时&#xff0c;如果是英文或数字没一点问题&#xff0c;但是用到中文是居然出现不可识别的中文乱码了&#xff0c;下面看我解决json_encode中文乱码方法。在网上找到一种解决方法&#xff1a;代码如下复制代码后来请教了别人&#xff0c;还可以用base…

oracle 根据用户备份,Oracle基于用户的备份及恢复

要执行exp或imp命令&#xff0c;首先&#xff1a; 1.看Oracle安装目录的bin目录下有没有 exp.exe和 imp.exe这两个文件&#xff0c;要不然可能无法执行这个命令的要执行exp或imp命令&#xff0c;首先&#xff1a;1.看Oracle安装目录的bin目录下有没有 exp.exe和 imp.exe这两个文…

oracle数据库sql的执行过程,Oracle体系结构之SQL语句的执行过程

一般来说,数据库处理SQL都会经过三个过程:解析(parse)、执行(exec)、返回结果(fetch)1.解析当用户发起一个SQL语句时&#xff0c;Oracle通过Server Process 接收SQL语句到达oracle实例&#xff0c;并在Shared pool 中的 Library Cache 查找是否存在该语句对应执行计划的缓存。如…

otb100matlab,ECO for tracking 在 OTB100 基准测试和 VOT2016 数据集中的实验结果

目前本文所涉内容均未使用图形处理器。运行在有图形处理器环境下的实验将在稍后补充&#xff0c;敬请关注。需要准备的文章和工具有&#xff1a;一、集成 OTB1001.1 下载基准测试在该目录中可以看到&#xff1a;trackers 目录中已经包含了若干跟踪算法。而我们要做的就是把 ECO…

如何设置oracle_home变量,oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量?

oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量&#xff1f;我遇到了与此处列出的问题相同的问题&#xff1a;尽管我没有丢失密码&#xff0c;但如何恢复或更改Oracle sysdba密码&#xff0c;我最初在configure脚本中输入了两次&#xff0c;然后登录(localhost&#xff1a;…

oracle脱机什么意思,脱机的是什么意思

1. 或者是&#xff0c;将记录传送到脱机系统去处理&#xff0c;以降低交换机的负荷。Alternatively, the records can be transferred to an off-line system for processing, to reduce the load on the exchange.2. 虽然第三方可用的应用软件很少&#xff0c;但在 Windows 1.…

oracle adg 备份,Oracle Physical Dataguard环境使用RMAN备份和恢复

Oracle Physical Dataguard环境使用RMAN备份和恢复由于Physical Dataguard使用的是块恢复技术来保持和PRIMARY的一致性&#xff0c;因此可以在STANDBY上进行rman备份&#xff0c;从而减轻PRIMARY的压力.当PRIMARY出现数据库故障时&#xff0c;可以使用在STANDBY上的备份来进行恢…