题意

link(more:129.P1044

简化题意:给定严格从 \(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\) 的全排列与其非法序列的差,但由此还无法得到非法序列的普遍特性,而影响它是否是合法序列的,无外乎就是 压入、弹出两个操作

那么我们可以具象化压入为 + ,弹出为 - ,可以得到对应的 +- 序列为:

\[\begin{cases}
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}\) ,这两个显然是等价的:

\[C_{2n}^{n-1}=\frac{(2n)!}{[2n-(n-1)]!(n-1)!}=\frac{(2n)!}{(n+1)!(n-1)!}
\]
\[C_{2n}^{n+1}=\frac{(2n)!}{[2n-(n+1)]!(n+1)!}=\frac{(2n)!}{(n-1)!(n+1)!}
\]

合法序列的组合数

综上所述,可抽象为:

由分别 \(n\) 个 0 和 1 排成的,任意前缀和都 \(\geqslant 0\) 的序列的数量为:

\[C_{2n}^n-C_{2n}^{n-1}=\frac{(2n)!}{n!n!}-\frac{(2n)!}{(n-1)!(n+1)!}=\frac{C_{2n}^n}{n+1}
\]

∴定义卡特兰数 \(\large Cat_n=\frac{C_{2n}^n}{n+1}\) .

此题思路

不知道要鸽多久,代码还没弄懂...

[0x11] 130.火车进站问题【卡特兰数】的更多相关文章

  1. hdu1023:卡特兰数

    火车进站问题 卡特兰数引入的例子. 卡特兰数递推公式:h(n)=h(n-1)*(4*n-2)/(n+1) 通项公式:h(n)=c(2n,n)/(n+1)... 这题需要高精度,刚好学了一下java.. ...

  2. 【讲●解】火车进出栈类问题 & 卡特兰数应用

    火车进出栈类问题详讲 & 卡特兰数应用 引题:火车进出栈问题 [题目大意] 给定 \(1\)~\(N\) 这\(N\)个整数和一个大小无限的栈,每个数都要进栈并出栈一次.如果进栈的顺序为 \( ...

  3. CH1102 火车进出栈问题(高精/卡特兰数)

    描述 一列火车n节车厢,依次编号为1,2,3,-,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入格式 一个数,n(n<=60000) 输出格式 一个数s表示 ...

  4. HDU 1023 Train Problem II (卡特兰数,经典)

    题意: 给出一个数字n,假设火车从1~n的顺序分别进站,求有多少种出站序列. 思路: 卡特兰数的经典例子.n<101,用递推式解决.需要使用到大数.n=100时大概有200位以下. #inclu ...

  5. Train Problem II(卡特兰数 组合数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1023 Train Problem II Time Limit: 2000/1000 MS (Java/ ...

  6. HDOJ 1023 Train Problem II 卡特兰数

    火车进站出站的问题满足卡特兰数...卡特兰数的相关知识如下: 卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. ...

  7. hdu1032 Train Problem II (卡特兰数)

    题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...

  8. hdu 5673 Robot 卡特兰数+逆元

    Robot Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem D ...

  9. 卡特兰数Catalan——定义、公式、模型总结

    推荐:卡特兰数总结 定义: f(i)表示,从(0,0)出发,到(i,i),每次只能向上或者向右走,并且不越过红线的方案数. 这个图片的点上的数字,其实告诉我们f[i],就可以根据这个n方dp得到. 其 ...

随机推荐

  1. cf1082 A. Vasya and Book

    中文题意: 思路:我们先看看能不能直接从x翻到y,abs(y-x)%d==0,可以就直接输出abs(y-x)/d咯,不行的话之后有2种操作 1.先翻回到第一页,从第一页看看能不能范到y,不能的话翻到最 ...

  2. JavaScript基本语法(数组与JSON)

    5.数组 #①使用new关键字创建数组 // 1.创建数组对象 var arr01 = new Array(); // 2.压入数据 arr01.push("apple"); ar ...

  3. String简介

    String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String实现了Serializable接口:表示字符串是支持序列化的.实现了 ...

  4. 分支结构之二:switch-case

    1.格式 switch(表达式){case 常量1: 执行语句1; //break; case 常量2: 执行语句2; //break; ... default: 执行语句n; //break; } ...

  5. 在Centos7上安装JDK1.8和tomcat8.5的步骤和过程(亲测可用)

    文章目录 1.在阿里云(Linux)Centos7上安装JDK1.8步骤过程 2.阿里云(Linux)centos7上安装Tomcat8.5步骤过程记录: 卸载JDK Centos7一般都会带有自己的 ...

  6. Go | 基本数据类型的相互转换

    基本数据类型的相互转换 Go在不同类型的变量之间赋值时需要显示转换,不能自动转换 基本语法 表达式 T(v): 将值v转换成类型T T就是数据类型: int32, int64, float32... ...

  7. day02-HTML02

    4.HTML 4.3HTML基本标签 4.3.9表格(table)标签 基本语法: <table border="边框宽度" cellspacing="空隙大小&q ...

  8. Java单例模式,看这一篇就够了

    在创建型设计模式中,我们第一个学习的是单例模式(Singleton Pattern),这是设计模式中最简单的模式之一. 单例是什么意思呢? 单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并 ...

  9. 开源项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字相似度/markdown 目录

    前言 以前在 github 上自己开源了一些项目.碍于技术与精力,大部分项目都是 java 实现的. 这对于非 java 开发者而言很不友好,对于不会编程的用户更加不友好. 为了让更多的人可以使用到这 ...

  10. Electron是什么以及可以做什么

    新用户购买<Electron + Vue 3 桌面应用开发>,加小册专属微信群,参与群抽奖,送<深入浅出Electron>.<Electron实战>作者签名版. 1 ...