洛谷 P1044栈题解--zhengjun

题目背景

栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。

栈有两种最重要的操作,即 \(pop\)(从栈顶弹出一个元素)和 \(push\)(将一个元素进栈)。

栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。

题目描述

宁宁考虑的是这样一个问题:一个操作数序列,\(1,2,\dots ,n\)(图示为 \(1\)\(3\) 的情况),栈 \(A\) 的深度大于 \(n\)

现在可以进行两种操作,

将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 \(push\) 操作)
将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 \(pop\) 操作)
使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 \(1\ 2\ 3\) 生成序列 \(2\ 3\ 1\) 的过程。

(原始状态如上图所示)

你的程序将对给定的 \(n\),计算并输出由操作数序列 \(1,2,\dots,n\) 经过操作可能得到的输出序列的总数。

输入格式

输入文件只含一个整数 \(n\)\(1 \leq n \leq 18\))。

输出格式

输出文件只有一行,即可能输出序列的总数目。

输入输出样例

输入 #1 复制
3
输出 #1 复制
5

思路

这题其实是一道裸的卡特兰数。

如果还没有学过卡特兰数

参见卡特兰数--zhengjun

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int a[19][19];
int main(){
	scanf("%d",&n);
	for(int i=0;i<=n;i++){
		a[i][0]=1;
	    for(int j=1;j<=i;j++)
	        a[i][j]=a[i-1][j]+a[i][j-1];
	}
	printf("%d",a[n][n]);
	return 0;
}

谢谢--zhengjun

posted @ 2022-06-10 19:13  A_zjzj  阅读(21)  评论(0编辑  收藏  举报