[0x11] 130.火车进站问题【卡特兰数】
题意
简化题意:给定严格从 \(1\thicksim n\) 这 \(n(n\leqslant 6\times10^4)\) 个整数,规定每个数都要进出栈各一次,求所有可能的出栈序列的数量。
这题有多种做法(爆搜,递推,dp,数学),最主要是 \(n\) 的范围,刚好会把像递推和 dp 这样的 \(O(n^2)\) 的次优化算法卡掉。
显然复杂度就要求是线性的,如此,可以使用组合数学中的 卡特兰数Catalan(link)。
理论推导
首先,我们以 \(n=3\) 为例,可以得到所有合法序列为: \(\{123,132,213,231,321\}\) 。
可以想到合法序列的数量就是 \(n\) 的全排列与其非法序列的差,但由此还无法得到非法序列的普遍特性,而影响它是否是合法序列的,无外乎就是 压入、弹出两个操作 。
那么我们可以具象化压入为 +
,弹出为 -
,可以得到对应的 +-
序列为:
123&+-+-+-
\\132&+-++--
\\213&++--+-
\\231&++-+--
\\321&+++---
\end{cases}\]
合法序列规律
观察可得:
- \(num(+)=num(-)=n\);(注意:非法序列也可以)
- ∵在合法序列中,每一次弹出都与前面的一次压入是对应的,∴易得 \(\boxed{ sum_i\geqslant0(i\in[1,2n])}\) .(根据y总的说法,此乃 Catalan 的本质也)
非法序列规律
可能有的人和我一样,认为这里讨论的非法序列定义为:全排列中在栈中不可能存在的序列,但就是不存在,那我们也无法用 +-
序列表示出来。
那么,非法序列岂不是随便乱糊,可以有无数个了吗?
因此,我们必须在保证包括所有合法序列在其中的所有序列的集合中探求,形象地:
回到合法序列的两个规律中,显然非法序列就必须有两种性质:
- \(num(+)=num(-)=n\);
- \(sum_i<0(i\in[1,2n]).\)
所有序列的组合数
诶,我们顺便可以得到所有序列的公式啦,∵不管合不合法,都保证了同一性质,相当于在 \(2n\) 个空位中插入 \(n\) 个 +
或 -
,即: \(\large C_{2n}^n\) .
格式有点乱,不要紧,继续探求非法序列。
我们在 平面直角坐标系 上对其进行进一步探究。(我们把 \(+,-\) 分别对应 \(x,y\) 作为一个单位的增量,且只能有这两种操作)
由于 \(num(+)=num(-)=n\) ,∴研究范围是 \((0,0)\) 到 \((n,n)\) ,可以建立 \(Oxy\) ,并随便把合法和非法的序列表示在上面:
根据图像并结合先前的规律二,当在某一时刻 \(sum_i<0\) 时,则此时 \((x,y)\) 中 \(y>x\) ,总结易得,定义 \(y=x\) 为法线,当图像越过法线时,就为非法序列。
∵不好判断 越过 ,且合法路径也可以与法线有交点。
且 \(y>x\iff y\geqslant x+1\)
∴,当它越过法线就必然与 \(y=x+1\) 有交点,如图:
名字随便取着玩的
接下来这一步思想,可以说 前无古人,后无来者 了。
我们找到图中非法路径与高压法线的 第一个 交点,把交点后的原路径关于高压法线轴对称,与交点前的原路径形成一条从 \((0,0)\) 到 \((n-1,n+1)\) 的路径,如图:
现在要开始转换了:(目的是将有条件限制的路径转换为无条件限制的路径)
我们把原路径叫做 \(A\) ,轴对称后的路径叫做 \(B\) .
在 \((0,0)\) 到 \((n,n)\) 中, \(A\) 是唯一的,且在 \((0,0)\) 到 \((n-1,n+1)\) 中, \(B\) 是唯一的, 且有且仅有 \(A\) 和 \(B\) 关于高压法线成轴对称;
∴ \(A\) 和 \(B\) 是一一对应的。
那么 非法路径的数量就等于从 \((0,0)\) 到 \((n-1,n+1)\) 的路径的数量 。
这下简单了,非法序列的数量等于该路径的数量,而该路径的数量,相当于走了 \((n-1)+(n+1)=2n\) 步,其中向右走了 \((n-1)\) 步、向上走了 \((n+1)\) 步,那么总数就为: \(\large C_{2n}^{n-1}\) 或 \(\large C_{2n}^{n+1}\) ,这两个显然是等价的:
\]
\]
合法序列的组合数
综上所述,可抽象为:
由分别 \(n\) 个 0 和 1 排成的,任意前缀和都 \(\geqslant 0\) 的序列的数量为:
\]
∴定义卡特兰数 \(\large Cat_n=\frac{C_{2n}^n}{n+1}\) .
此题思路
不知道要鸽多久,代码还没弄懂...
[0x11] 130.火车进站问题【卡特兰数】的更多相关文章
- hdu1023:卡特兰数
火车进站问题 卡特兰数引入的例子. 卡特兰数递推公式:h(n)=h(n-1)*(4*n-2)/(n+1) 通项公式:h(n)=c(2n,n)/(n+1)... 这题需要高精度,刚好学了一下java.. ...
- 【讲●解】火车进出栈类问题 & 卡特兰数应用
火车进出栈类问题详讲 & 卡特兰数应用 引题:火车进出栈问题 [题目大意] 给定 \(1\)~\(N\) 这\(N\)个整数和一个大小无限的栈,每个数都要进栈并出栈一次.如果进栈的顺序为 \( ...
- CH1102 火车进出栈问题(高精/卡特兰数)
描述 一列火车n节车厢,依次编号为1,2,3,-,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入格式 一个数,n(n<=60000) 输出格式 一个数s表示 ...
- HDU 1023 Train Problem II (卡特兰数,经典)
题意: 给出一个数字n,假设火车从1~n的顺序分别进站,求有多少种出站序列. 思路: 卡特兰数的经典例子.n<101,用递推式解决.需要使用到大数.n=100时大概有200位以下. #inclu ...
- Train Problem II(卡特兰数 组合数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1023 Train Problem II Time Limit: 2000/1000 MS (Java/ ...
- HDOJ 1023 Train Problem II 卡特兰数
火车进站出站的问题满足卡特兰数...卡特兰数的相关知识如下: 卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
- hdu 5673 Robot 卡特兰数+逆元
Robot Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- 卡特兰数Catalan——定义、公式、模型总结
推荐:卡特兰数总结 定义: f(i)表示,从(0,0)出发,到(i,i),每次只能向上或者向右走,并且不越过红线的方案数. 这个图片的点上的数字,其实告诉我们f[i],就可以根据这个n方dp得到. 其 ...
随机推荐
- CentOS 7.9 安装 kafka_2.13
一.CentOS 7.9 安装 kafka_2.13 地址 https://kafka.apache.org/downloads.html 二.安装准备 1 安装JDK 在安装kafka之前必须先安装 ...
- LeNet-论文阅读
概述 Yann LeCun, Leon Bottou, Yoshua Bengio, and Patrick Haffner的论文<Gradient-Based Learning Applied ...
- uoj131【NOI2015】品酒大会
题目链接 很容易想到p和q"r相似"就等价于在后缀数组中q与p之间的height值\(\ge r\),也就是说\(<r\)的那些height值会把排好序后的后缀分割成若干段, ...
- golang中的字符串
0.1.索引 https://waterflow.link/articles/1666449874974 1.字符串编码 在go中rune是一个unicode编码点. 我们都知道UTF-8将字符编码为 ...
- wpf下的图片放大缩小
WPF下实现图片的放大缩小移动 在windows 7里面有自带的图片查看器,这个软件可以打开一张图片然后以鼠标在图片中的焦点为原点来进行缩放,并且放大后可以随意拖动.下面我们在WPF中实现这个功能 ...
- k8s机器群扩容问题
今天遇到了一个很奇葩的问题.公司新人吧k8s集权扩容完后,发现服务器上的磁盘没有做分区2T磁盘没有做任何动作 把两台slave节点扩容上去的节点弄到了/目录.由于是生产环境情况比较特殊并没通过kube ...
- 【Azure 环境】Azure 云环境对于OpenSSL 3.x 的严重漏洞(CVE-2022-3602 和 CVE-2022-3786)的处理公告
问题描述 引用报告:(OpenSSL3.x曝出严重漏洞 : https://www.ctocio.com/ccnews/37529.html ) 最近OpenSSL 3.x 爆出了严重安全漏洞,分别是 ...
- zk系列一:zookeeper基础介绍
聊完kafka必不可少的需要再聊一聊zk了,下面开始 一.ZK是什么 ZooKeeper是分布式应用程序的高性能协调服务.它可以实现分布式的选主.统一配置管理,命名,分布式节点同步,分布式锁等分布式常 ...
- srcddd
目录 application assembler UserReq.go UserRsp.go dto MessageResult.go UserDTO.go services UserService. ...
- 基于python的数学建模---洛伦兹线与数值解
import numpy as np from scipy.integrate import odeint from mpl_toolkits.mplot3d import Axes3D import ...