热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

卡特兰数应用--n个元素的出栈顺序与从(0,0)到(n,n)不穿过对角线的方法数

1.出栈顺序方法数:hdoj1023求出栈序列,比如1,2,3,出栈序列为321,123,132,213,231,一共5种第一种思路:我们把入栈看做1,出栈看

1.出栈顺序方法数:

hdoj1023

求出栈序列,比如1,2,3,出栈序列为3 2 1,1 2 3,1 3 2,2 1 3,2 3 1,一共5种

第一种思路:

我们把入栈看做1,出栈看做0,那么入栈出栈看做一系列的1010。。。,但是必须保证从左往右
看的时候1必须多余0,这个是卡塔兰数的第二个应用,种数为:C(n,2n)-C(n+1,2n).
粗略这样理解:我们从2n个位置中选出n个来存放1,方法数为C(n,2n),减去不满足的情况。
不合法的情况:我们在2n个位置放n+1个0,n-1个1,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数,即C(n+1,2n)。

比如:对于数列10101001010100, 在第7个位置上首先出现了0比1多的情况,而在后面的数列中0的总计数还是比1的总计数多1(n+1个0, n-1个1)。如果把后面数列的0和1互换,那么整个数列就能够保证0和1的计数是相等的。同时对应了一种不符合要求的排列方法:10101000101011.

所以总的方案数为:h(n)=C(n,2n)-C(n+1,2n).

第二种思路:

这种方法直接来源于卡特兰数3的递推公式:h(n) = h(0) * h(n- 1) + h(1) * h(n - 2) + ... + h(n - 1) * h(0)

令f(n)为n个字符的出栈序列的方法数

假设在出栈序列中,在数1在第k个位置出栈,则之前有k-1个字符已经出栈,后面还有n-k个字符未出栈,那么在这种情况下出栈方案数为f(k-1)*f(n-k), k = 1, 2, 3, ...,n

f(0) = 1, f(1) = 1

那么f(n) = f(0) * f(n - 1) + f(1) * f(n - 2) + ... + f(n - 1) * f(0) = h(n)

第三种思路:

使用折现法,这种方法与从(0, 0)到坐标(n ,n)不通过对角线的方法数有异曲同工之妙,具体见:http://blog.sina.com.cn/s/blog_6917f47301010cno.html

2.从(0,0)到(n,n)不穿过对角线的方法数

hdoj2067

给出一个棋盘n*n,求从左下角到右上角的不经过对角线的所有走法,这个经过分析也是卡特兰数。我们把往右走看做1,把往上走看做0,那么从左向右看做一系列的101100.。。,和那个求出栈序列的就是一个问题了,即0的个数不能超过1,由于上半角和下半角一样,所以求出来卡特兰数*2就是我们的答案了。

注:从(0,0)到(n, n)不 接触 对角线上的点 和从(0, 0)到(n, n)不 穿过 对角线上的点的方法数是不同的。后者可看作n个字符的出栈序列,前者可看作在先在栈中加入一个字符,之后在最后的操作之前栈底不能为空,所以方法数为h(n - 1)。

同样可以使用对称的方法求解:

对于不能接触对角线的方法数的解法为:由于不接触对角线,那么第一步一定走向(1, 0), 倒数第二步的位置一定是(n, n - 1)。那么总的方法数为:C(n - 1, 2n-2)。之后需要减去接触对角线的方法数:如果我们从(0, 1)出发,到达(n, n -1)的路径一定会接触对角线,而这样的路径和从(1, 0)到(n, n -1)不合法的路径是一一对应的的(可以把它从最后离开对角线的点到(1, 0)做一个关于y=x的对称),那么总的方法数为2 * (C(n- 1, 2n - 2) - C(n, 2n - 2)) = 2 * h(n - 1)种方法

对于可以接触但不能穿过对角线的解法为:不能穿过y=x,等价与不能接触y=x+1,所以,从(0, 0) 到(n, n)的总方法数为C(n, 2n),之后减去不符合要求的方法数。将(0, 0)关于y=x+1做对称可得到点(-1, 1),从(-1, 1)到点(n, n)必定接触y=x+1,方法数为C(2n - 1, 2n)。所以符合要求的方法数为:C(n, 2n) - C(2n - 1,2n) = C(n, 2n) - C(2n + 1,2n) = h(n)


这两种问题通过卡特兰数可以很容易地解决,可以看我转的一篇文章:blog.csdn.net/u014097230/article/details/44244793


推荐阅读
  • 尽管已经查阅了相关说明,但关于Html.Partial和Html.RenderPartial在ASP.NET MVC3中的使用,我仍然感到困惑。 ... [详细]
  • 转自:http:blog.sina.com.cnsblog_67419c420100vmkt.html 1.为什么要使用blocks将一个blocks作为函数或者方法的参数传递,可 ... [详细]
  • CSS技巧:创建带有背景图的按钮
    本文详细探讨了使用CSS创建带有背景图片的按钮的方法,并提供了具体的实例代码,帮助开发者解决实际开发中的相关问题。 ... [详细]
  • 配置PicGo与Gitee结合Typora打造高效写作环境
    本文详细介绍了如何通过PicGo和Gitee搭建个人图床,并结合Typora实现高效的文章撰写。包括创建图床项目、生成访问令牌、安装配置PicGo和Typora等步骤。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 集群与负载均衡技术解析
    本文探讨了集群(Cluster)的概念,即通过网络连接的一组计算机系统,它们作为一个整体提供服务,实现分布式计算。文章还详细介绍了负载均衡技术,旨在提高网络服务的效率和可靠性。 ... [详细]
  • 本文详细介绍了利用JavaScript实现的五种不同的网页弹出窗口技术,包括全屏窗口、全屏模式窗口、带收藏链接工具栏的窗口、网页对话框及HTA窗口。 ... [详细]
  • Python游戏开发实战:外星人入侵项目详解
    本文详细介绍了使用Python进行《外星人入侵》游戏开发的全过程,包括环境搭建、游戏逻辑设计及代码实现等关键步骤,适合对游戏开发感兴趣的朋友参考。 ... [详细]
  • 本文介绍了如何使用Maven命令对Spring Boot项目中的子模块进行独立打包,包括依赖树的查看、项目的运行和打包等基本操作。 ... [详细]
  • 系统:MacOS10.15.2,XCode11.3,swift5.0写作时间:2020-01-09说明Swift中的闭包(Closur ... [详细]
  • 深入理解异步多线程编程模型
    现代计算机系统中的CPU通过并行处理提高效率,但所谓的并发处理实际上是一种基于轮询的模拟并行。本文探讨了现代处理器如何通过虚拟化技术实现更高的并发性能,以及在.NET框架中如何有效利用线程和异步编程模式。 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • 本文通过具体示例详细介绍了 Python 中的装饰器和装饰类的使用方法,包括带参数的装饰器和装饰类的应用场景。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
author-avatar
流云清动_438
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有