带约束的排列
现实里的排列常带一句附加条件,最常见的两类是「某些元素两两不相邻」与「某些元素必须相邻」。它们各有一个对偶的标准技巧,插空法与捆绑法。两者都不是新公式,只是乘法原理与排列数的组合运用:把无约束的部分先排好,再用一步受控的选位安置受约束的部分。
1 · 插空法
要让 个元素两两不相邻,正面逐个排布很难保证这个条件。换个角度:先把其余 个可以相邻的元素排成一列作骨架,这一步有 种。骨架排好后,元素之间与两端一共形成 个空隙;只要让每个受约束元素各占一个不同的空隙,它们就被骨架天然隔开。从 个空隙里有序地放入 个,正是 ,故总数为
2 · 捆绑法
对偶的问题是让 个元素必须相邻。既然它们必须连在一起,就把这 个捆成一个整体当作单独一个元素,与其余 个自由元素一起排,共 个单元,有 种;捆内部这 个元素自己还能换序,再乘 :
插空与捆绑是一对互补的思路:不相邻用插空,把受约束元素拆开塞进不同空隙;相邻用捆绑,把受约束元素合并成一个整体。两者都把带约束的排列化归为一次普通全排列加一步选序,本质仍是排列。若要按字典序真正生成这些排列,见算法系列排列生成。
3 · 参考文献
- Permutation. Wikipedia. 排列与 ,带约束排列是其常见变体。https://en.wikipedia.org/wiki/Permutation
- Inclusion–exclusion principle. Wikipedia. 约束更复杂时(多组不相邻)插空之外还需容斥。https://en.wikipedia.org/wiki/Inclusion%E2%80%93exclusion_principle