简单格路计数相关
形式
无限制
最简单的一种。
- 从 \((0,0)\) 走到 \((n,m)\),每次只能向上或向右走,一共有 \(\dbinom {n+m} n\) 种方案。
不碰线格路计数问题
问题:从 \((0,0)\) 走到 \((n,m)\),每次只能向上或向右走,且不能碰到直线 \(y=x+1\),问有多少种方案。
考虑容斥,总方案数为 \(\dbinom {n+m}n\) 种。
考虑第一次碰到直线后,把后面的路径按 \(y=x+1\) 对称一下,相当于走到 \((n-1,m+1)\)。
发现走到 \((n-1,m+1)\) 既是充要的,又是必要的,所以碰到直线的方案数就是 \(\dbinom {n+m} {n+1}\)。
双不碰线格路计数问题
问题:从 \((0,0)\) 走到 \((n,n)\),不能碰到直线 \(y=x-1\) 和直线 \(y=x+k\)(显然两条直线平行),求方案数。
还是容斥,总方案数为 \(\dbinom {2n} n\)。
减去分别碰到 \(y=x-1\) 和 \(y=x+k\) 的方案数,但是如果两条都碰呢?
考虑再加上先碰 \(y=x-1\) 再碰 \(y=x+k\) 的,以及先碰 \(y=x+k\) 再碰 \(y=x-1\) 的。
一直这样算下去,直到超出可行范围内。
补充:对于原来的两条直线 \(y = x + b_1,\ y = x + b_2\),以及折了若干次的直线 \(y = x + c_1, \ y = x + c_2\),新的直线为 \(y = x + 2b_1 - c_2,\ y = x + 2b_2 - c_1\)
应用
Catalan number
定义卡特兰数 \(C_n\) 为从 \((0,0)\) 走到 \((n,n)\) 且不碰到直线 \(y=x+1\) 的方案数。
容易算出
运用模型:
-
长度为 \(2n\) 的合法括号序列数。
-
\(1,2,...,n\) 依次入栈,合法出栈序列数。
-
\(n\) 个点的无标号有根二叉树数量。
-
\(n\) 边凸多边形的三角剖分方案数。
根号分治
- 题目:有两个人,从 \((0,0)\) 走到 \((n,n)\),每一步都同时走,全程两人之间的曼哈顿距离不超过 \(2k\),求方案数。
发现同时向上/右走不影响两人之间的距离,考虑枚举异方向走的步数 \(d\)。
-
第一个人向上走,第二个人向右走,距离 \(+2\)。
-
第一个人向右走,第二个人向上走,距离 \(-2\)。
相当于一个变量,每次 \(+1\) 或 \(-1\),操作 \(2n\) 次,最后变为 \(0\),全程都在 \([-k,k]\) 内。
放在平面上,从 \((0,0)\) 走到 \((n,n)\),不能碰到 \(y=x-k-1\) 和 \(y=x+k+1\)。
反射容斥,双不碰线问题,答案为 \(\dbinom {2n} n - 2\dbinom {2n} {n-(k+1)} + 2\dbinom {2n} {n-2(k+1)} ...\)
这样算复杂度为 \(O(\dfrac {n^2} k)\)。
我们可以 DP,复杂度为 \(O(nk)\)。
根号分治,\(O(n\sqrt n)\)。
LIS \(\le 2\)
问题:求有多少个排列 \(p\),满足 LIS \(\le 2\)。
考虑取反,最长下降子序列长度 \(\le 2\)。
根据 Dilworth 定理,最大反链等于最小路径覆盖,即排列 \(p\) 可以被划分为两个上升子序列。
- 一个很牛逼的 DP:设 \(f[i,j]\) 表示填写了 \(p_{1...i}\),最大值为 \(j\) 的合法方案数。
考虑转移到 \(i+1\),下一个填的数可以比 \(j\) 大:\(f[i+1,k]\gets f[i,j] (k>j)\)。
否则一定填 \(<j\) 的没填的最小数字,如果不填最小,那么之后填这个最小数字会产生一个长度为 \(3\) 的下降子序列。
这样转移为 \(f[i+1,j]\gets f[i,j]\)。
那么 \(f[i+1,j...n]\gets f[i,j]\)。
考虑转格路计数问题,相当于从 \((0,0)\) 走到 \((n,n)\),不能碰到 \(y=x-1\),其实就是 \(C_n\)。

浙公网安备 33010602011771号