首页 > 其他分享 >最长上升子序列的优化求法和Dilworth定理

最长上升子序列的优化求法和Dilworth定理

时间:2025-01-02 18:32:13浏览次数:1  
标签:std 定理 求法 lnis lis 序列 Dilworth 上升 最长

最长上升子序列的优化求法和Dilworth定理

最长上升子序列

学过DP的都知道,求最长上升子序列的DP做法的时间复杂度是\(O(n^2)\)的,现在介绍一个\(O(n*\log n)\)的二分做法

二分做法

3 5 2 3 7 1一组原始数据,最长上升子序列的长度应该是3,为序列2 3 7
使用队列q,先把第一个元素放进去
q: 3
从第二个元素 x 开始只要满足最长上升子序列的条件就加在后面,不满足就在队列中找第一个比 x 大的元素替换 (用二分查找)
q: 3 5
q: 2 5
q: 2 3
q: 2 3 7
q: 1 3 7 这是最后一个状态,此时队列的长度即是最长上升子序列的长度,但是内容不是正确的那个最长上升子序列
  • 此做法只关注最后的长度,不关注内容是否正确

Dilworth定理

原链的最长长度=反链划分数的最小值

这是简单的总结,原始定义网上有很多

原链和反链?

不上升子序列 和 上升子序列互为反链

不下降子序列 和 下降子序列互为反链

链的划分数?

假设链是上升子序列,则按照上升子序列的规则对链进行划分,得到的满足规则的小链的数量即是链的划分数

重要例题

P1020 [NOIP1999 提高组] 导弹拦截

https://www.luogu.com.cn/problem/P1020

思路

第一问:根据题意很容易想到,就是一道求最长非上升子序列的问题,也很容易想到DP的做法

但是这道题会卡\(O(n^2)\)的做法,所以要采用二分法\(O(n * \log n)\)

第二问:第二问其实就是求不上升子序列的最小划分数,根据Dilworth定理,可以转化成求最长上升子序列的长度

代码

#include <bits/stdc++.h>

typedef std::pair<int, int> pii;
#define INF 0x3f3f3f3f
#define MOD 998244353
using i64 = long long;
const int N = 1e5+5;
int a[N];

void solve(){
	int n = 0;
	while (std::cin >> a[n]){
		n++;
	}
	std::vector<int> lnis, lis;
	lnis.push_back(a[0]);
	lis.push_back(a[0]);

	for (int i = 1; i < n; i++){
		if (*lnis.rbegin() >= a[i]){
			lnis.push_back(a[i]);
		}else{
			int k = std::upper_bound(lnis.begin(), lnis.end(), a[i], std::greater<int>()) - lnis.begin();
			lnis[k] = a[i];
		}

		if (*lis.rbegin() < a[i]){
			lis.push_back(a[i]);
		}else{
			int k = std::lower_bound(lis.begin(), lis.end(), a[i]) - lis.begin();
			lis[k] = a[i];
		}
	}

	std::cout << lnis.size() << '\n' << lis.size();

}

signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);
	int t = 1, i;
	for (i = 0; i < t; i++){
		solve();
	}
	return 0;
}

标签:std,定理,求法,lnis,lis,序列,Dilworth,上升,最长
From: https://www.cnblogs.com/califeee/p/18648524

相关文章

  • 电路笔记(六)电路定理(二)
    内容源于蜂考 1.戴维南定理和诺顿定理 例题: 2.最大功率传输定理 例题: ......
  • 傅里叶变换的乘法性质&卷积定理
    傅里叶变换是将一个信号从时域转换到频域的工具。傅里叶变换有许多重要的性质,其中乘法性质和卷积定理是两个非常重要的概念。乘法性质:时域中的乘法对应于频域中的卷积。卷积定理:时域中的卷积对应于频域中的乘法。乘法性质傅里叶变换的乘法性质表明,如果两个函数......
  • 裴蜀定理的证明
    定理内容对于任意不全为\(0\)的整数\(a,b\),方程\(ax+by=\gcd(a,b)\)一定有整数解\(x,y\)。证明引理\(1\)对于两个正整数\(a,b\)满足\(a>b\)可以推出\(\gcd(a,b)=\gcd(b,a\bmodb)\)。设\(a=kb+c,d\mid\gcd(a,b)\),那么一定有\(d\mida,d\midb\)。通过移项可以......
  • 数论四大定理
    数论四大定理:包括威尔逊定理、欧拉定理、孙子定理(中国剩余定理)、费马小定理同余同余:对于任意整数a,b,对指定的整数m(m>1)进行整除,若余数相同,则称a和b模m同余,记作\(a\equivb(mod\quadm)\)例如:\(3\equiv10(mod\quad7)\)通过整数m对任意整数进行分类,同余(模m)为一类,即剩余类......
  • 大学微积分 AB 第六单元-3:变革的整合与积累(微积分基本定理与定积分、不定积分和不定
          微积分基本定理与定积分 例子: 不定积分和不定导数 例子: 例子2: 例子: 例子: ......
  • [学习笔记] 二项式定理与反演
    一假设\(f(x)\)代表恰好满足\(x\)个性质的方案数。钦定代表至少\(x\)个。假设\(g(x)\)代表至多满足\(x\)个性质的方案数。显然有\[g(n)=\sum_{i=0}^n\left(\begin{matrix}n\\i\end{matrix}\right)f(i)\]并且有\[f(n)=\sum_{i=0}^n\left(\begin{matrix}n\\i\end{ma......
  • 一文搞定理解RPC
    前言RPC概念RPC协议RPC组成RPC协议RPC框架RPC的优点RPC与HTTP的区别前言RPC的概念相信很多软件从业人员或多或少都接触过,从开发到测试都可能需要跟它打交道。但是对于为什么要用RPC?RPC的优点是什么?RPC是什么原理?它跟HTTP有什么不同?相信并不是每个人都比较熟悉。那么今天我们就......
  • 对于矩阵树定理的运用
    学得很肤浅,但是常见的东西还是要记一下。证明以后懂了再补。一些定义:定义\(deg_x\)表示点\(x\)的度数,\(cnt_{i,j}\)表示\(i\)到\(j\)相连有的边数。度数矩阵\(D\):\(D_{i,i}=deg_i\),\(D_{i,j}=0(i\neqj)\);关联矩阵\(A\):\(A_{i,j}=cnt_{i,j}\);Laplace......
  • 【数理统计】极限定理及抽样分布
    目录中心极限定理抽样分布卡方分布t分布F分布正态总体的【样本均值】与【样本方差】的分布中心极限定理【中心极限定理】设随机变量\(X_k(k=1,2,...,n)\)相互独立且服从同一分布,数学期望\(E(X_k)=\mu\),方差\(D(X_k)=\sigma^2\),当\(n\)充分大时,有\(\frac{\bar{X}-\mu}{......
  • 扩展欧拉定理证明
    我们知道,扩展欧拉定理的内容如下:\[a^b\equiv\begin{cases}a^b&b<\varphi(m)\\a^{(b\bmod\varphi(m)+\varphi(m))}&b\ge\varphi(m)\end{cases}\pmodm\]但是又有多少人会它的证明呢?也许大佬们一看到就会证了,但是我刚刚才会,不得不说oi-wiki上的证明是真屎。首先第一种情况......