首页 > 其他分享 >求序列中最长不升子序列的长度和不升子序列的个数

求序列中最长不升子序列的长度和不升子序列的个数

时间:2024-09-16 15:52:43浏览次数:13  
标签:个数 back height stk1 stk2 不升子 push 序列

狄尔沃斯定理(Dilworth's theorem)

该定理表述为:在一个有限的偏序集 P 中,最大抗链的大小等于最小覆盖的大小。换句话说,若 P 是一个有限的偏序集,且 α 是 P 中的一个最大抗链(即其中任意两个元素不可比较),而 β是 P 的一个最小覆盖(即覆盖所有元素的最小链),则有:∣α∣=∣β∣

在一个给定的序列中,最长递增序列的长度与不升序列的个数之间存在一种对偶关系。具体来说,若我们考虑一个有限的偏序集,其中元素的比较关系是基于大小关系的,那么:

不升序列的个数可以看作是一个抗链的大小。

最长递增序列的长度可以看作是一个链的大小。

采用二分贪心来解决,时间复杂度为O(nlogn)

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

vector<ll> heights;
vector<ll> stk1;
vector<ll> stk2;

void solve() {
	for(ll height : heights) {
		if(stk1.empty()) {
			stk1.push_back(height);
		} else {
			if(stk1.back() >= height) {
				stk1.push_back(height);
			} else {
				auto pos = upper_bound(stk1.begin(), stk1.end(), height, [](const ll &u, const ll &v) {return u > v;});
				*pos = height;
			}
		}
		if(stk2.empty()) {
			ans.push_back(height);
		} else {
			if(stk2.back() < height) {
				ans.push_back(height);
			} else {
				auto pos = lower_bound(stk2.begin(), stk2.end(), height);
				*pos = height;
			}
		}
	}
	cout << stk1.size() << '\n' << stk2.size();
}

int main()
{
	ll height;
	while(cin >> height) {
		heights.push_back(height);
	}
	solve();
	return 0;
}

标签:个数,back,height,stk1,stk2,不升子,push,序列
From: https://blog.csdn.net/joker822519866/article/details/142303327

相关文章

  • 完整代码——SASRec 基于自注意力的序列推荐
    关于“SASRec基于自注意力的序列推荐”这篇论文的学习笔记和代码复现可以看之前写的这两篇:学习笔记——SASRec基于自注意力的序列推荐-CSDN博客代码复现——SASRec基于自注意力的序列推荐-CSDN博客这次是关于这篇论文的代码展示,全文一万六千多字,难免会有所疏漏,有任何问题......
  • 代码随想录算法训练营Day5 | 哈希表理论基础、242.有效的字母异位词、349.两个数组的
    哈希表理论基础哈希表哈希表是根据关键码的值而直接进行访问的数据结构。数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:哈希表一般用来快速判断一个元素是否出现集合里。哈希函数哈希函数通过特定编码方式,可以将其......
  • 数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
    时间序列概况在日常生活和专业研究中都很常见。简而言之,时间序列概况是一系列连续的数据点 y(0),y(1),...,y(t) ,其中时间 t 的点依赖于时间 t-1 的前一个点(或更早的时间点)。在许多应用中,研究者致力于预测时间序列概况的未来行为。存在各种建模方法。这些模型通常基......
  • 信息学奥赛初赛天天练-90-CSP-S2023基础题2-离散数学、染色、完全三叉树、平面图、边
    PDF文档公众号回复关键字:202409152023CSP-S选择题1单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)6以下连通无向图中,()一定可以用不超过两种颜色进行染色A完全三叉树B平面图C边双连通图D欧拉图7最长公共子序列长度常常用来衡量两个序列的相......
  • Hetao P1391 操作序列 题解 [ 绿 ] [ 二维线性 dp ]
    操作序列:简单的二维dp。观察我们每次操作可以让\(x\)变为\(2x-1\),或者当\(x\)为奇数时让\(x\)变为\(\frac{x+1}{2}\)。显然,执行第一种操作,会使\(x\)变成奇数。那一旦我们连续执行两次操作,\(x\)就会变为:\[\frac{(2x+1)-1}{2}=\frac{2x}{2}=x\]也就是说,当\(x\)......
  • 学习笔记——MMSR 自适应多模态融合的序列推荐
    AdaptiveMulti-ModalitiesFusioninSequentialRecommendation Systems前几天当我在阅读这篇论文的时候,在网上找到的相关资料很少,所以当时我读这篇论文的时候特别痛苦,精读了两天半.....所以现在我将自己学习笔记分享出来,给后面需要的小伙伴借鉴借鉴。我目前也是处于学习的......
  • 每日OJ_牛客_NC313 两个数组的交集
    目录牛客_NC313 两个数组的交集解析代码牛客_NC313 两个数组的交集两个数组的交集_牛客题霸_牛客网classSolution{public:/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@paramnums1int整型vec......
  • 加法时间序列模型原理及Python实践
    加法时间序列模型是一种经典且广泛应用的时间序列分析方法,其原理主要基于将时间序列数据分解为几个相互独立的组成部分,以便更好地理解、分析和预测时间序列的特征和规律。以下是加法时间序列模型原理的详细阐述:一、模型定义加法时间序列模型假设时间序列数据Y[t]由四个基......
  • 乘法时间序列模型原理及Python实践
    乘法时间序列模型是时间序列分析中的一种重要方法,其原理主要基于将时间序列数据分解为多个相互关联的组成部分,并通过乘法关系将它们组合起来以描述和预测时间序列的变动。以下是对乘法时间序列模型原理的详细阐述:一、模型定义乘法时间序列模型假设时间序列数据Y[t]由四个......
  • 【视频讲解】线性时间序列原理及混合ARIMA-LSTM神经网络模型预测股票收盘价研究实例
    原文链接:https://tecdat.cn/?p=37702 原文出处:拓端数据部落公众号 分析师:DongzhiZhang 近年来人工神经网络被学者们应用十分广泛,预测领域随着神经网络的引入得到了很大的发展。本文认为单一神经网络模型对序列所包含的线性信息和非线性信息的挖掘是有限的,因此本文为了进一......