当前位置: 首页 > news >正文

【算法专题】卡特兰数(计数数列)

Catalan数列:1 1 1 2 5 14 42 132 429 1430 4862 16796

【计数映射思想】

参考:卡特兰数 — 计数的映射方法的伟大胜利

计数映射:将难以统计的数映射为另一种形式的可以统计的数。

一、入栈出栈序

n个数字,有多少种合法的入栈出栈序列?n=3时的合法序列之一:+1,-1,+1,+1,-1,-1

对于n个数字,就是要在2n个1中添加n个“+”,则序列总数C(2n,n)。

对于未入栈先出栈的不合法情况,在其第一次前缀和为-1时,将前面的所有符号反转,此时整个序列有n+1个“+‘和n-1个’-‘,每个不合法序列都映射为2n个1中添加n+1个'+'构成的序列。

正向:每个不合法序列第一个前缀和为-1的位置反转后,形成的序列不同。

反向:每个含n+1个"+"的序列,第一个前缀和为1的位置反转后,形成的不合法序列不同。

所以得到卡特兰数:Cn=C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1)

例一、含n+1个节点的满二叉树形态数:中序遍历,向左+1向右-1,转化为入栈出栈序。

例二、圆上n个点连弦数:顺时针顺序每次+1和-1连弦,转化为入栈出栈序。

例三、n对括号表达式:左括号+1右括号-1,括号表达式组合数转化为入栈出栈序。

例四、n+1个数字连乘:结合n次即有n对有效括号,转化为括号表达式。

例五、凸n+2边形的三角剖分数:对边进行编号,然后顺时针扫描,实际上是n+1条边的连乘方案,转化为入栈出栈序。

二、不跨线路径数(几何模型)

入栈出栈序:考虑n*n的方格,从左下到右上不跨越对角线的路径数,向右记为+1,向上记为-1,跨越对角线就是前缀和为-1,则转化为入栈出栈序。

考虑n*m的方格,一条不合法路径在第一次跨越对角线的时候,将前面的路径翻转(上变左,左变上),那么就变成了到(n-1,m+1)的路径数。

那么f(n,m)=C(n+m,n)-C(n+m,n-1)。

 

【分治思想】

一个问题A,规模为n,可以用分治的思想,先固定一个元素,然后将剩下n-1个元素拆分成两个问题,根据固定的元素位置不同,两个问题分别是(0,n-1)(1,n-2)...(n-1,0)。

例一、入栈出栈序:固定最后出栈的数字是第k个加入的数,那么k前面是k-1个数的入栈出栈序问题,k后面是n-k个数的入栈出栈序问题,则有:

C(n)=C(0)*C(n-1)+C(1)*C(n-2)+...+C(n-1)C(0),即C(n)=ΣC(i)*C(n-i-1),i=0~n-1,C(0)=1

例二、凸n+2边形三角剖分数:先固定三角形V1VkVn+2,划分成凸k多边形和凸n+2-k边形,转化为Cn。

★总结:Catalan数的题目,一般从几种方式看出:转化为入栈出栈序,转化为几何不跨线路径数,定点分治思想,打表

转载于:https://www.cnblogs.com/onioncyc/p/8213374.html

相关文章:

  • 51cto任意密码修改(失效了)
  • Wannafly挑战赛7 C - 小Q与氪金游戏
  • [c#基础]DataTable的Select方法
  • Hibernate 缓存
  • ESXi 5.0 环境下安装部署Cisco Nexus 1000v
  • Python之内置函数
  • Lucene知识小总结7:评分设置
  • Rust语言:安全地并发
  • python基础===python中文手册
  • 便是管理,不是管理
  • 6-1 接口的特性
  • 驱动和应用层的三种通信方式
  • 《Java编程思想》笔记03------访问权限控制
  • 记笔记与博客
  • 树的遍历
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 2018一半小结一波
  • Docker入门(二) - Dockerfile
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java2019面试题北京
  • JavaScript 基本功--面试宝典
  • 第十八天-企业应用架构模式-基本模式
  • - 概述 - 《设计模式(极简c++版)》
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 判断客户端类型,Android,iOS,PC
  • 配置 PM2 实现代码自动发布
  • 七牛云假注销小指南
  • 前端知识点整理(待续)
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 再次简单明了总结flex布局,一看就懂...
  • 【干货分享】dos命令大全
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #《AI中文版》V3 第 1 章 概述
  • #Ubuntu(修改root信息)
  • (03)光刻——半导体电路的绘制
  • (4)Elastix图像配准:3D图像
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (六)软件测试分工
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十三)Maven插件解析运行机制
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)visual stdio 书签功能介绍
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net core控制台应用程序初识
  • .NET delegate 委托 、 Event 事件
  • .net 程序发生了一个不可捕获的异常
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • ??eclipse的安装配置问题!??
  • @test注解_Spring 自定义注解你了解过吗?
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法