2024.9.8 闲话
前言:以前就想写一下 kernel method 的介绍,刚才 joke3579 又催了一下,那么就简单写了一份说明 .
核方法 (kernel method) 可以用来解决一类空间上的随机游走问题,可能有一些位置有几条直线作为边界不能越过,这个中文名字是我瞎翻译的 .
省流
一般形式说明起来也不太容易讲清楚,这个省流比较混乱最好还是不看,直接看后面的例子基本上也能看明白了 .
大概操作就是考虑多元生成函数 \(F(x_{1\dots m};t)\) 分别计量走到的位置 \((x_1,x_2,\cdots,x_m)\) 和走的步数 \(t\),那么可以大概得出一个这种类型的方程:
这里 \(D\) 枚举格路上的一步,\(x'\) 用来限制不能走出边界 .
此时令核函数 \(K(x_{1\dots m})=\prod x_i(1-t(\sum_DD(x_{1\dots m})))\) 然后可以把方程简化为:
这里 \(x'\) 可能有一些部分不一样,\(G\) 是一个固定多项式 .
然后解方程的话基本是考虑依次解出每个 \(F(x'_{1\dots m};t)\),可以分别构造一个别的项都没有贡献的 \(x_{1\dots m}\) 代入 .
然而这个省流基本上也不太可读,举一些例子方便理解一下:
Catalan 数
从 \((0,0)\) 出发,每次走一步 \((1,1)\) 或 \((1,-1)\),不能走到 \(x\) 轴下方,问走到 \((n,m)\) 的方案数 .
令答案是 \(f(n,m)\),考虑二元生成函数:
那么可以根据定义导出一个简单的方程:
此处令 \(K(x)=x(1-t(x+x^{-1}))\),这是这个游走问题的核 (kernel),则方程可以简化为:
这个方程还不能直接解出,此时考察函数 \(X\) 使得 \(K(X(x))=0\),可以解出:
由于某些原因此处需要 \(\lim\limits_{x\to 0}X(x)=0\),于是这里 \(\pm\) 取负号 . 在方程中代入 \(x=X(x)\) 等号左边就是 0 了,从而即可解出 \(F(0;t)\),进而可以解出 \(F(x;t)\) . 后面都是一些简单的操作,不展开叙述 .
值得注意的是,EI 利用游走的对称性给出了一个解方程的其他方法:「营业日志 2021.2.5」反射容斥的代数推导 .
然后可以看一下二元的情况怎么解方程:
云斗括号序列题 组合刻画部分
一个仅含 \(\texttt{( ) ?}\) 的字符串是好的当且仅当可以把每个 \(\texttt?\) 替换为 \(\texttt(\) 或 \(\texttt)\) 使得最终形成一个匹配的括号串 .
计算长为 \(2n\) 含 \(k\) 个 \(\tt ?\) 的好串个数 .
让我们跳过一些组合推导,快进到解方程环节:
其中核函数 \(K(x,y)=xy(1-t(x^{-1}y^{-1}+xy+sxy^{-1}))\) .
这里先考虑去掉 \(D(0,0,s,t)\),考虑函数 \(Y\) 满足 \(K(1,Y(t))=0\),那么代入 \(x=1,y=Y(t)\) 就可以了 .
然后就变成一元情况了,可以使用上一个问题的操作方法 .
最后的结果可以看 2024.7.28 闲话,还是挺复杂的 .
另一个二元形式的例子:The 3rd UCup Stage 1: St. Petersburg. L. Candies,这里二元指的是只有两个方向有限制 . Alpha1022 的题解基本上也是使用的 kernel method,不过解方程部分用的是类似 EI 反射容斥代数推导的方法 .
参考资料:THE KERNEL METHOD: A COLLECTION OF EXAMPLES, Helmut Prodinger .
图
meme
结果机房的 IP 还是没解封。。敲打一下(
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18402671
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ