首页 > 其他分享 >最长上升子序列

最长上升子序列

时间:2023-10-17 22:47:15浏览次数:31  
标签:dots le LIS 序列 长度 上升 最长 dp

引入

以下记 \(s\) 的长度为 \(n\),\(t\) 的长度为 \(m\)。

一些问题:

  • 什么是子序列?

    称 \(t\) 是 \(s\) 的子序列,即是 \(s\) 删掉一些元素(可以什么都不删)后可以得到 \(t\)。

  • 什么是上升子序列?

    称 \(t\) 是上升子序列,仅当 \(s\) 的子序列 \(t\) 满足 \(\forall i\in[1,m),t_i<t_{i+1}\)(即单调上升)。

  • 什么时最长上升子序列?

    是上升子序列中长度最长(可能多个)的。

(最长不降子序列同理。)

以下将最长上升子序列简写为 LIS。

求法

\(O(n^2)\) 求长度

记 \(dp_i\) 表示 \(s\) 的前缀 \(s[1\dots i]\) 的 LIS 的长度,并制约:\(s[1\dots i]\) 的 LIS 必须以 \(s_i\) 结尾。

可以发现,因为我们一定要选 \(s_i\),我们可以枚举上一个选的 \(s_j\),并用 \(dp_j\) 更新 \(dp_i\):

\[dp_i=\max\{dp_j+1\},1\le j<i\le n \]

很好理解,因为一定选 \(s_i\),所以长度要加 \(1\)。

答案是 \(\max\{dp_i\},1\le i\le n\),因为每一个 \(1\le i\le n\) 都可能当 LIS 的结尾。

这样做是 \(O(n^2)\) 的。能否优化?

\(O(n\log n)\) 求长度

发现当 \(s[1\dots i-1]\) 的 LIS 中最后一个数小于 \(s_i\) 时,\(s[1\dots i]\) 的 LIS 可以照抄 \(s[1\dots i-1]\) 的,并在最后加上 \(s_i\)。

原因:(为方便,暂时记 \(s[1\dots i-1]\) 的 LIS 为 \(t\))

\[\overbrace{t_1<t_2<\cdots<t_m}^{\text{LIS 原有条件}}<s_i \]

依然单调上升。

我们当然希望每次都满足这个条件,但不满足怎么办?

臆想:直接将 \(s_i\) 替换进 \(t\)。

其实有一定合理性。我们将设法用 \(s_i\) 替换 \(t\) 中某个位置,并让 \(t\) 依然单调递增。这个位置上的数是第一个大于 \(s_i\) 的。它可以二分确定(因为 \(t\) 单调递增)。

但 \(t\) 就没有了顺序性:后来的 \(s_i\) 反而跑到了前面,所以这个操作使 \(t\) 不合法。

其实这个操作并不影响 \(t\) 的长度,所以答案不会变劣。但可能变好:如果 \(s_i\) 刚好是答案序列的一部分,那么它使 \(t\) 的字典序变小,递增长度可能更长,答案可能会变得更大。(其实挺玄学的。)

最后,我们得到了一个 \(O(n\log n)\) 求 LIS 长度的算法。

如果求字典序最小的 LIS 呢?

\(O(n\log n)\) 求字典序最小的 LIS

未完待续……

标签:dots,le,LIS,序列,长度,上升,最长,dp
From: https://www.cnblogs.com/chargedcreeper/p/lis.html

相关文章

  • n log n 的求最长上升子序列
    \(O(n\logn)\)的求最长上升子序列法一:二分intLIS(){intb[MAXN],top=0,a[MAXN];b[0]=-1;for(inti=1;i<=n;i++){if(a[i]>b[top]){top++,b[top]=a[i];}else{intl=1,r=top;w......
  • Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列
    全文链接:https://tecdat.cn/?p=33885原文出处:拓端数据部落公众号本文描述了帮助客户使用马尔可夫链蒙特卡洛(MCMC)方法通过贝叶斯方法估计基本的单变量随机波动模型,就像Kim等人(1998年)所做的那样。定义模型以及从条件后验中抽取样本的函数的代码也在Python脚本中提供。  ......
  • R语言武汉流动人口趋势预测:灰色模型GM(1,1)、ARIMA时间序列、logistic逻辑回归模型|附代
    全文链接:http://tecdat.cn/?p=32496原文出处:拓端数据部落公众号人口流动与迁移,作为人类产生以来就存在的一种社会现象,伴随着人类文明的不断进步从未间断。人力资源是社会文明进步、人民富裕幸福、国家繁荣昌盛的核心推动力量。当前,我国经济正处于从以政府主导的投资驱动型的经......
  • [刷题笔记] CSP-J 2022 T4 上升点列
    Description在一个二维平面内,给定\(n\)个整数点\((x_i,y_i)\),此外你还可以自由添加\(k\)个整数点。你在自由添加\(k\)个点后,还需要从\(n+k\)个点中选出若干个整数点并组成一个序列,使得序列中任意相邻两点间的欧几里得距离恰好为\(1\)而且横坐标、纵坐标值均单调不......
  • R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达
    全文下载链接:http://tecdat.cn/?p=25880 最近我们被客户要求撰写关于泊松过程的研究报告,包括一些图形和统计输出。本文描述了一个模型,该模型解释了交易的聚集到达,并展示了如何将其应用于比特币交易数据。这是很有趣的,原因很多。例如,对于交易来说,能够预测在短期内是否有更多的买......
  • LeetCode 376. 摆动序列
    最长递增子序列题目链接:376.摆动序列题目描述:如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为**摆动序列。**第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如,[1,7,4,9,2,5]是一个摆动序列......
  • P9744 消除序列 题解
    本题有多种解法,我这里先讲一个我的考场做法吧。切入点我们发现我们至多使用一次操作一,而剩下部分的\(0\)肯定是依靠操作二补全,操作三的作用只是用来填补操作一的空白的,所以我们发现我们对一个序列的操作一定是前一段用操作一和操作三,后一段用操作二。思路1一开始考虑暴力\(......
  • P9744 「KDOI-06-S」消除序列
    题目传送门这道题在比赛时先花了一个小时理解好题意才打了一个\(70\)分的\(O(n^2)\)暴力。下午刚起床,有点困,还没进入状态,打得挺慢。具体地,会发现操作实际上是在这个长度为\(n\)的序列找一个点\(i\),将\([0,i]\)通过操作\(1\)全变\(0\),设\(x=\displaystyle\sum_{k\in......
  • 数据结构之拓扑序列
    例题展示例题解决拓扑排序指的是从一个入度为0的点开始,将这个点记录下来,同时将这个点以及这个点的出度的线去除,再找入度为0的点,直到将所有的顶点遍历完成。故而,上述例题中的拓扑排序序列为01243567012436570214356702143657四种。......
  • 32. 最长有效括号
    给你一个只包含'('和')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例1:输入:s="(()"输出:2解释:最长有效括号子串是"()"思路classSolution{public:intlongestValidParentheses(strings){intsize=s.length();vector<......