卡特兰数列(出站序列统计)

问题描述

栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数。
输入
就一个数n(1≤n≤15)。
输出
一个数,即可能输出序列的总数目。
样例输入
3
样例输出
5

问题分析

常规分析(循环递归)

首先设f(n)为序列个数为n的出栈顺序序列数,先假定最后出来的元素为k,则在k入栈前有f(k-1)种情况,在k出栈前有f(n-k)种情况,由于前k-1项与后n-k项相互独立,则用乘法定理可得最后出来的元素为k的情况有f(k-1)f(n-k)种;而k可以从1~n,所以f(n)=f(0)f(n-1)+f(1)f(n-2)...+f(n-1)f(0);

源代码
#include<stdio.h>
int f(int n)
{
    int sum=0;
    if(n==0||n==1) return 1;
    else{
        for (int i=1;i<=n;i++)
        {
            sum+=f(i-1)*f(n-i);
        }
    }
    return sum;
}
int main()
{
    int n;
    scanf("%d",&n);
    printf("%d",f(n));
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,955评论 18 399
  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 6,910评论 0 3
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 5,370评论 0 2
  • 有报道说,比尔盖茨上个世纪关于IT与互联网的诸多预言,已经变成了神预言,几乎全部实现了。那么,在新媒体领域,他的预...
    杰罗姆阅读 4,474评论 0 2
  • 一个美国小女孩在学校里通过笔记本电脑上的视频见到了她当兵的爸爸的面容的一瞬间变得异常激动,差点要哭出来了。过了一会...
    益源教育阅读 1,384评论 0 0