|
先来考虑一个排列可到达的条件是什么。
如果不是 n 排列,而是 01 序列的话,那么条件是显然的:只要对于任意 i,序列 b 的 第 i 个 1 都位于序列 a 的第 i 个 1 的右边(不一定严格),那么 a 就可以到达 b。 对于一个 n 排列 a,以及一个数 k,把 a 中大于 k 的数标为 1,剩下的数标为 0, 就能得 到一个 01 序列。如果对于任意的 k,排列 a 对应的 01 序列都能够到达排列 b 对 应的序列,那么排列 a 就可以到达排列 b。 它的必要性是显然的。至于充分性,可以观察下面这个移动策略: i 从 n 到 1 的顺 序,每次将数字 i 移到它的目标位置,令当前位置为 l,目标位置为 r,当前 (l, r] 区间的 最大数字为 a[j],那么把 a[l] 和 a[j] 交换一下即可。 容易看出这样移动一定是可行的。 那么只要做一个 01 串 DP: F[i][j]表示到第 i 位,已经用了的集合为 j 的方案数,从一个全 0 的串开始,每次转移 是枚举第 i 位放几,即将串中的某个 0 改为 1,最后到达一个全 1 的串,且保证经过的都 是合法 01 串。
题目 4178 排列
2025-10-04 15:11:28
|