本期主要讲解 \(\text{LIS}\) 相关问题。
知识点
最长上升子序列 \(\text{LIS}\),是指在一个序列中任选若干个元素组成的单调递增的序列的最大长度。
求 \(\text{LIS}\) 的步骤:
-
定义状态:令 \(dp_i\) 表示以 \(i\) 结尾的 \(\text{LIS}\) 的长度。
-
转移方程:我们尝试对于每一个满足 \(1 \le i \le n\) 的 \(a_i\),寻找它之前的元素 \(a_j\),若 \(a_i>a_j\) 尝试接在其后,同时它也可以自己新成为一个 \(\text{LIS}\),则转移方程为
- 初始条件:
时间复杂度 \(O(n^2)\)。
同时关于 \(\text{LIS}\),还有一个很重要的结论:
- 一个序列中能覆盖整个序列的最少的下降子序列的个数,等于这个序列的 \(\text{LIS}\) 的长度。
证明:
-
令能覆盖整个序列的最少的下降子序列的个数为 \(x\),\(\text{LIS}\) 的长度为 \(y\),若要证明 \(x=y\),则需证明 \(x \le y\) 且 \(x \ge y\)。
-
首先证明 \(x \le y\):我们知道,每个下降子序列里都会包含一个元素,它比它之前的所有下降子序列的元素都大,因为若不是这样,那么这个下降子序列就应当被其他下降子序列所包含。而这些元素一定能构成一个上升子序列,这个序列的长度一定 \(\le y\),因此 \(x\) 一定 \(\le y\)。
-
其次证明 \(x \ge y\):我们知道,\(\text{LIS}\) 中的每个元素一定被包含在一个下降子序列中(不然就会出现可以包含的情况),因此下降子序列的个数至少为 \(y\),因此 \(x\) 也一定 \(\ge y\)。
这个结论被称作 \(\text{Dilworth}\) 定理,上面的分析只是一种感性的证明方法,具体的笔者也没学会,所以先咕着。
T1
本题与板子不同的地方在于,它求的是最长下降子序列,并且Kid 可以往左飞也可以往右飞,前者很好解决。
对于后者,我们分别计算出以 \(i\) 结尾的最长下降子序列的长度和以 \(i\) 开头的最长下降子序列的长度,再取 \(\max\) 即为答案。
但是以 \(i\) 开头的最长下降子序列的长度是不好直接求出的,因此我们转化为求以 \(i\) 结尾的最长上升子序列的长度即可。
T2
第一问显然就是求最长下降子序列的长度。
对于第二问,运用开头讲到的 \(\text{Dilworth}\) 定理,求出最长上升子序列即可。
这个方法是 \(O(n^2)\) 的,在 lg 上过不了。
好像可以使用二分优化,但是笔者还不会 \(qwq\),所以还是先咕着。
T3
很容易想到将长或宽排序。
然后这题就和 T2 一模一样了。