一些简单的偏序问题

首先,你要会二维偏序(最长上升子序列),这样就可以了(三维偏序等不需要)。


这里引入一个重要的关于偏序的定理:狄尔沃斯(Dilworth)定理。

  • 偏序:对于一个集合 \(S\),偏序是它上面的一个二元关系 \(\preceq\),满足自反性 \(\forall a\in S,a\preceq a\),传递性 \(\forall a,b,c\in S(a\preceq b\wedge b⪯c)\Longrightarrow a\preceq c\),以及反对称性 \(\forall a,b\in S(a\preceq b\wedge b\preceq a)\Longrightarrow a=b\)

  • 链:对于集合 \(S\) 的子集 \(T\),如果 \(T\) 中任意两个元素均可比(即 \(\forall a,b\in T,a\preceq b\vee b\preceq a\)),则称 \(T\) 为链,称 \(|T|\) 为链的长度。

  • 反链:对于集合 \(S\) 的子集 \(T\),如果 \(T\) 中任意两个元素均不可比(即 \(\forall a,b\in T,a\not\preceq b\wedge b\not\preceq a\)),则称 \(T\) 为反链,称 \(|T|\) 为反链的长度。

  • 最小链/反链划分:将 \(S\) 划分为最少的集合 \(T_1,T_2,\cdots,T_k\),使得所有 \(T_i\) 均为链/反链,这个链/反链划分的大小为 \(k\)

狄尔沃斯定理的叙述为:对于任意偏序集 \(S\),最长反链长度等于最小链划分,最长链长度等于最小反链划分(证明不在此赘述,如有需要请自行查找资料)。

这个定理很抽象,我们来看一个简单一点的例子。


P1020 [NOIP1999 提高组] 导弹拦截

给定一个长度为 \(n\) 的序列 \(a\),需要你求出其最长不上升子序列长度,以及最少能够划分成多少个不上升子序列(\(1\le n\le 10^5\))。

第一问很好做,对于第二问,考虑狄尔沃斯定理,一个很常见的手法就是将一个序列转化为点对 \((i,a_i)\),再定义偏序关系 \((x_1,y_1)\preceq (x_2,y_2)\Longleftrightarrow x_1\le x_2\;\wedge y_1\ge y_2\) 定义在集合 \(S=\{(i,a_i)\}(1\le i\le n)\),显然这个偏序关系满足自反性,也满足传递性和反对称性,所以这种偏序关系是合法。

容易发现这种偏序关系中的链代表一个不上升子序列,反链代表一个上升子序列。狄尔沃斯定理告诉我们,最长链长度等于最小反链划分,最小反链划分就是第二问的答案,最长链的长度就是最长上升子序列的长度,那么第二问的答案就是最长上升子序列的长度。

是不是对狄尔沃斯定理有了一定的了解,再来看一道题。


P3974 [TJOI2015] 组合数学

现有一个 \(n\times m\) 的网格图,\((i,j)\) 网格上有 \(a_{i,j}\in[0,10^6]\) 个财宝,你可以从 \((1,1)\) 走到 \((n,m)\),每一次走可以将路径上的每一个点的财报数量减一(若是负数则不变),求你最少需要走多少次,才能将网格图上的所有财宝捡完。

这是一道最小链覆盖问题,考虑使用狄尔沃斯定理,我们需要定义一种偏序关系使得这种偏序关系中的链是 \((1,1)\)\((n,m)\) 的一条路径,且偏序关系是合法的。

由于一条从 \((1,1)\)\((n,m)\) 的一条路径,那么路径中的每一个点的横坐标与纵坐标都单调不降,所以考虑偏序关系 \((x_1,y_1)\preceq (x_2,y_2)\Longleftrightarrow x_1\le x_2\;\wedge y_1\le y_2\) 定义在可重集合 \(S\)\(S\) 中包含 \(a_{i,j}\)\((i,j)\),容易证明这样的偏序关系是合法的。由于这种偏序关系的自反性,所以链并不是每次取一个财宝,而是可以取多个,这样与题意不符,需要另找偏序关系使其满足每一个元素都不重复。

定义这样一个偏序关系 \((x_1,y_1)\preceq (x_2,y_2)\Longleftrightarrow x_1\le x_2\;\wedge y_1\le y_2\;\wedge (x_1,y_1)\neq(x_2,y_2)\),其定义在集合 \(S\) 中,\(S\) 包含 \(a_{i,j}\)\((i,j,k)(k\in[1,a_{i,j}])\),但是这样不满足自反性,所以将其改成 \((x_1,y_1,z_1)\preceq (x_2,y_2,z_2)\Longleftrightarrow (x_1,y_1,z_1)=(x_2,y_2,z_2)\vee(x_1\le x_2\;\wedge y_1\le y_2\;\wedge (x_1,y_1)\neq(x_2,y_2))\)(越来越抽象),这样的偏序关系既合法,又符合本题中的链。

由于最小链覆盖等于最长反链长度,所以考虑反链是什么。如果两个元素 \((x_1,y_1,z_1)\)\((x_2,y_2,z_2)\)(不妨设 \(x_1\le x_2\))不可比,那么 \((x_1,y_1,z_1)\) 一定不等于 \((x_2,y_2,z_2)\),其次要满足 \(y_1>y_2\),而且可以重复选择 \((x,y,a)\)\((x,y,b)\),反链用文字表述为:从左下角往右上角走,保证路径中的任意点不相邻,且路径上的点的行数单调递减,列数单调递增,反链的长度即为路径上所有点的财宝数和。

接下来的事情就简单了,我们可以用 dp 解决。设 \(f_{i,j}\) 表示选到 \((i,j)\) 的最大链长,那么就有转移式:

\[f_{i,j}=\max\{\max_{k<i,l<j}f_{k,l}+a_{i,j},\max_{k\le i,l\le j,(k,l)\neq(i,j)}f_{k,l}\} \]

可以从不可比的元素中转移并加上该权值,也可以不加该权值从任何地方转移。

显然 \(\displaystyle\max_{k<i,l<j}f_{k,l}=f_{i-1,j-1},\max_{k\le i,l\le j,(k,l)\neq(i,j)}f_{k,l}=\max\{f_{i-1,j},f_{i,j-1}\}\),所以最终的转移式为:

\[f_{i,j}=\max\{f_{i-1,j},f_{i,j-1},f_{i-1,j-1}+a_{i,j}\} \]

(其实可以直接从这里看,也很好理解)

这题就做完了。


CF1620F Bipartite Array

定义一个序列长度为 \(n\) 的序列 \(a\) 对应一个图 \(G\) 如下生成:

  • \(G\)\(n\) 个点;
  • 如果 \(i,j\) 满足 \(i<j\wedge a_i>a_j\),则 \(G\) 中有 \(i\leftrightarrow j\) 的无向边。
    如果 \(G\) 是二分图,称 \(a\) 是 bipartite array。
    给定一个长度为 \(n\) 的排列 \(a\),判断能否通过将一些数改成其相反数而使得排列变为 bipartite array。如果可以,输出方案。
posted @ 2024-11-26 22:21  liruixiong0101  阅读(12)  评论(0编辑  收藏  举报