Catalan数-卡特兰数

article/2025/11/7 9:49:56

Catalan数-卡特兰数

一、定义

卡特兰数是一个数列,满足递推关系:h(0)=1,h(1)=1,h(n) = h(0)*h(n-1) + h(1)*h(n-2) + … + h(n-1)h(0),n>=2该递推关系的解为:h(n+1) = C(2n,n)/n+1,n=1,2,3,…(其中C(2n,n)表示2n个中取n个的组合数)

二、应用

1.进出栈问题
【问题描述1】
  1, 2, 3, 4依次进栈,则可能的一种进出栈顺序为:
1in->2in->2out->3in->4in->4out->3out->1out,所以出栈顺序为:2431,那么请问按照1, 2, 3, 4,…, n依次进栈,出栈顺序种数h(n)为多少?
【问题分析1】
  对n个数,假设数k最后一个出栈,k有n种可能,即每一个数都有可能最后出栈,我们算出每一种可能各有多少种情况,最后相加即可。
  因为k最后一个出栈,而进栈顺序又是从小到大来的,所以k前面的k-1个数在k进栈以前就已经全部出栈了,我们把前面k-1个数看出一个整体,那么前面k-1个数的出栈情况有h(k-1)种。
  在k进栈之后,比k大的n-k个数才能进栈,但是它们又比k早出栈,把这n-k个数同样看成一个整体,共有h(n-k)种可能。 当数k最后出栈时,一共有h(k-1)h(n-k)种可能,k从1取到n,再把每种可能相加即得到最终答案:

很明显可以看出,该表达式就是卡特兰数的递推式。

【问题描述2】
排队方式
  n个人手拿5元,n个人手拿10元,他们去排队买东西,东西价值5元,老板没有零钱(老板必须用收取的5元钞票给支付10元的顾客找零钱),请问一共有多少种排队方式?
【问题分析】
  将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈, 转换成进出栈问题,答案也为h(n)。

2.二叉树生成问题
【问题描述】
  有n个结点,请问总共能构成多少种不同的二叉树?
【问题分析】
  假设采用中序遍历,根节点第k个被访问,则根的左子树共有k-1个结点,右子树共有n-k个结点,k同样可以取1-n,这就与进出栈问题分析思路一致了,所以一共h(n)种。
  
3.凸多边形三角形划分
【问题描述】
  一个凸的n边形,用直线连接它的两个顶点使之分成多个三角形,每条直线不能相交,问一共多少种方案?
比如凸六边形的划分情况为:
在这里插入图片描述

h(6)=14。
【问题分析】
  我们将凸多边形顶点从p1一直编号到pn,以p1pn这条边为基准,任选一个数k(2<=k<=n-1),将p1,pk以及pn三点连接,构成了一个三角形。该三角形把该凸边形划分成了两个凸边形,一边顶点为1 ~ k-1,另一边为k+1 ~ n,于是又回到了进出栈问题,所以答案依旧为:h(n)。

4.括号匹配问题
【问题描述】
由1对括号,可以组成一种合法括号序列:()。
由2对括号,可以组成两种合法括号序列:()()、(())。
由n对括号组成的合法括号序列一共有多少种?
【问题分析】
  考虑n对括号时的任意一种配对方案,最后一个右括号有唯一的与之匹配的左括号,于是有唯一的表示A(B),其中A和B也是合法的括号匹配序列。
  假设S(n)为n对括号的正确配对数目,那么有递推关系S(n)=S(0)S(n-1)+S(1)S(n-2) +…+S(n-1)S(0),显然S(n)是卡特兰数。

5.满二叉树个数
【问题描述】
  n+1个叶子的满二叉树个数为多少?
【问题分析】
  不再分析,答案为h(n)。

6.圆划分问题
【问题描述】
  在圆上选2n个点,讲这些点成对连接起来,保证所有直线不相交,问一共多少种可能?
【问题分析】
  答案为h(n)。

7.填充问题
【问题描述】
  n个长方形填充一个高度为n的阶梯状图像方法数为多少?
【问题分析】
  答案为h(n)。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;const int maxn = 20;
int n;
ll f1[maxn], f2[maxn];
ll f[maxn * 2][maxn];//公式1:
int solve1() {f1[0] = f1[1] = 1;cin >> n;for(int i = 2; i <= n; i++) {for(int j = 0; j < i; j++) {f1[i] += (f1[j] * f1[i-j-1]);   //f(n)=f(0)f(n-1)+f(1)f(n-2)+...+f(n-1)f(0)  }}printf("%lld\n",f1[n]);return 0;
}//公式2:
int solve2() {f2[0] = f2[1] = 1;cin >> n;for(int i = 2; i <= n; i++){f2[i] += f2[i - 1] * (4 * i - 2) / (i + 1);  //f(n)=f(n-1)*(4*n-2)/(n+1)}printf("%lld\n", f2[n]);return 0;
}//公式3:
int solve3() {cin >> n;for(int i = 1; i <= 2 * n; i++) {f[i][0] = f[i][i] = 1;for(int j = 1; j < i; j++) {f[i][j] = f[i - 1][j] + f[i - 1][j - 1];     //f(n)=c(2n,n)/(n+1)}}printf("%lld",f[2 * n][n] / (n + 1));return 0;
}int main() {solve1();solve2();solve3();return 0;
} 

原博客1


http://chatgpt.dhexx.cn/article/gBPCtNU4.shtml

相关文章

Catalan 数

简介 卡特兰数又称卡塔兰数&#xff0c;英文名Catalan number&#xff0c;是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁查理卡塔兰 (1814–1894)的名字来命名&#xff0c;其前几项为&#xff08;从第零项开始&#xff09; : 1, 1, 2, 5, 14, 42, …

卡特兰(Catalan)数入门详解

文章目录 基本概念介绍定义 实际问题例题1方法01序列括号匹配进出栈问题312排列不相交弦问题二叉树的构成问题凸多边形的三角划分阶梯的矩形划分 也许更好的阅读体验 基本概念 介绍 学卡特兰数我觉得可能比组合数要难一点&#xff0c;因为组合数可以很明确的告诉你那个公式是…

Catalan数

Catalan&#xff08;卡特兰&#xff09;数 卡特兰数&#xff0c;又称卡塔兰数&#xff0c;是组合数学中一种常出现于各种计数问题中的数列。以比利时的数学家欧仁查理卡塔兰 (1814–1894)的名字来命名。1730年左右被蒙古族数学家明安图 (1692-1763)使用于对三角函数幂级数的推导…

服务端程序的keeplive

查看更多 https://www.yuque.com/docs/share/045e7b34-8b67-408f-bdac-11a2e8645342

LVS和Keeplive

文章目录 一、Keepalived 概述1. 为什么需要 keepalived2. keepalived 是什么3. keepalived 服务重要功能4. keepalived 高可用故障切换转移原理5. keepalived 体系主要模块及其作用6. 使用 keepalived 实现双机热备 二、LVS DR Keepalived 高可用集群构建1. 集群概述3. 案例…

RabbitMQ-KeepLive

文章目录 1. KeepLive基础知识2. KeepLive安装3. KeepLive主节点配置4. KeepLive从节点配置5. 执行脚本 1. KeepLive基础知识 基础概述 三大特性 高可用原理 2. KeepLive安装 3. KeepLive主节点配置 4. KeepLive从节点配置 5. 执行脚本 VIP的漂移&#xff1a;使用了同一…

list列表跳转保存位置,返回列表刷新keeplive

vue页面路由跳转离开时保存滚动条位置&#xff0c;进入该页面是获取位置 beforeRouteLeave (to, from, next) {const position document.documentElement.scrollTopsessionStorage.setItem(scrollTop, JSON.stringify(position))next()},// // 进入该页面时&#xff0c;用之…

keeplive+haproxy+nginx

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证…

keeplive发生脑裂问题处理过程

某上云项目中,k8s管理节点vip突然时不时无法访问了&#xff0c;针对这个问题&#xff0c;首先对vip发起了一个长ping;发现过一会就ping不通了&#xff0c;结果如下&#xff1a; 然后查看keeplive的日志&#xff0c;两台主机会发生vip会时不时的争抢&#xff1a; 因为我们在这两…

vue单页面html缓存问题,vue单页面 回退页面 keeplive 缓存问题

场景&#xff1a;项目中遇到 vue 点击回退 从A页跳到B页&#xff0c;缓存A页&#xff0c;当B页状态修改再次返回A时&#xff0c;A页查询条件缓存不刷新&#xff0c;列表刷新 A页&#xff1a; B页&#xff1a; html 解决方法&#xff1a; 利用keep-alive 缓存须要缓存的页面 1.…

Vue生命周期和钩子函数及使用keeplive缓存页面不重新加载

Vue生命周期 每个Vue实例在被创建之前都要经过一系列的初始化过程&#xff0c;这个过程就是vue的生命周期&#xff0c;在这个过程中会有一些钩子函数会得到回调 Vue中能够被网页直接使用的最小单位就是组件&#xff0c;我们经常写的&#xff1a; var vm new Vue({el: #app,...…

LVS(三)lvs+keeplive

一 场景引入1 我们知道LVS仅仅是做根据调度算法和策略来做负载均衡的&#xff0c;LVS本身只是调度后端服务器&#xff0c;并不管后端服务器的死活&#xff0c;想想这样一个场景&#xff1a;如果由于由于某种原因&#xff0c;后端服务器挂掉&#xff0c;而调度服务器却不知道&am…

lvs+keeplive

Keepalived概述 调度出现单点故障&#xff0c;如何解决&#xff1f;Keepalived实现了高可用集群Keeepalived最初是为LVS设计的&#xff0c;专门监控各服务器节点状态Keepalived后来加入了VRRP功能&#xff0c;防止单点故障 Keepalived运行原理 Keepalived检测每个服务器节点…

使用keeplive处理socket网络异常断开

网络异常断开原因主要有那些呢&#xff1f;归纳起来主要有以下两种&#xff1a; 1、客户端程序异常。 对于这种情况&#xff0c;我们很好处理&#xff0c;因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常&#xff08;就是WinSock2中的10054异常&#xff09;。…

mysql mm keeplive_mysql +keeplive

下载tar包 ./configure --prefix/usr/local/keepalived --with-kernel-dir/usr/src/kernels/2.6.32-431.el6.x86_64/ \ 注意加内核 &&make && make install cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived…

解决keep-live使用之后的问题

keep-aliv能够帮助我们实现页面ajax请求只被请求一次&#xff0c;在你跳转页面的时候&#xff0c;也不会被请求多次&#xff0c;可是比如在旅游页面中&#xff0c;当我们在城市选择页面重新选择城市&#xff0c;这个时候就需要重新发送一个ajax请求&#xff0c;来显示对应城市的…

nginx和keeplive实现负载均衡高可用

一、 Keeplive服务介绍 Keeplive期初是专门为LVS设计的&#xff0c;专门用来监控LVS集群系统中各个服务节点的状态&#xff0c;后来又加入VRRP的功能&#xff0c;因此除了配合LVS服务以外&#xff0c;也可以作为其他服务&#xff08;nginx&#xff0c;haroxy&#xff09;的高可…

php用Ajax传递数组

代码如下: 定义array数组 var array [1,2,3];$.ajax({url:"cart.php?actdelcart",async:false,type:POST,data:{array:array},dataType:json,traditional: true,success:function(data){alert(data)},error:function(){alert("#");}}); 当我们用ajax传递…

【JQuery】Ajax 参数为数组 的方法

背景介绍 前端页面为HTML&#xff0c; 后端为Spring html中根据多选框的值&#xff0c;使用ajax请求接口动态加载其他元素的选项值。 代码 // select 下拉多选框的值var idCardType $("#idCardType").val();// [2075, 2077, 2078]$.ajax({url : url,type : "…

使用ajax传递数组和后台接收

使用ajax异步的提交多选框得到需要操作的对象的id&#xff0c;这时我们可以把每一个id做出一个对象&#xff0c;之后放到一个数组中&#xff0c;再使用JSON.stringify()对这个数组进行json的格式化&#xff1b;在后台中再inputStream中解析出我们的json字符串&#xff0c;之后只…