LIS 也就是 f[i] 表示以 i 为结尾的最优答案, 原数列为 a。
首先可以直接用树状数组优化一下转移的复杂度, 这个方法比较naive就不说了。
另一种方法的话, 是维护一个 g 数组, 用 g[i] 记录 f 值为 i 的最小 a 值, 易证 g[1] <= g[2] <= …… <= g[n]。
用这个数组就可以很好地优化转移, 具体细节不赘述。
这个方法写起来相比树状数组方法更加短, 并且无需离散化。
满足:
自反性, 即 \(a\le a\)
反对称性, 即 \(a\le b, \; b\le a \; \to a = b\)
传递性, 即 \(a\le b, \; b\le c \to a \le c\)
的 \(A\) 上的二元关系 \(\le\) 称为偏序关系, 此时 \((A,\le)\) 就是一个偏序集。
一个 \(A\) 的子集, 满足任意两个元素之间都有偏序关系, 就称这个子集为这个偏序集的一条 链。
一个 \(A\) 的子集, 满足任意两个元素之间都有偏序关系, 就称这个子集为这个偏序集的一条 反链。
Dilworth定理的内容:
对于任意有限偏序集,其最大反链中元素的数目必等于最小链划分中链的数目。此定理的对偶形式亦真,它断言:对于任意有限偏序集,其最长链中元素的数目必等于其最小反链划分中反链的数目
for(int S0=S; S0; S0=(S0-1)&S)
原文地址:https://www.cnblogs.com/tztqwq/p/13907984.html