Loading

简单格路计数相关

形式

无限制

最简单的一种。

  • \((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\) 的方案数。

容易算出

\[ \begin{aligned} C_n &= \binom {2n} n - \binom {2n} {n+1} \\ &= \frac {(2n)!} {(n!)^2} - \frac {(2n)!} {(n-1)!(n+1)!} \\ &= \frac {(2n)!} {(n!)^2} (1 - \frac {(n!)^2} {(n-1)!(n+1)!}) \\ &= \frac {(2n)!} {(n!)^2} (1 - \frac {n} {n+1}) \\ &= \frac 1 {n+1} \binom {2n} n \end{aligned}\]

运用模型:

  • 长度为 \(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\)

posted @ 2024-05-05 18:58  Sktn0089  阅读(186)  评论(0)    收藏  举报