{"problem":{"name":"[NOIP 2003 普及组] 栈","description":{"content":"![](https://cdn.luogu.com.cn/upload/image_hosting/5qxy9fz2.png) 宁宁考虑的是这样一个问题：一个操作数序列，$1,2,\\ldots ,n$（图示为 1 到 3 的情况），栈 A 的深度大于 $n$。 现在可以进行两种操作， 1. 将一个数，从操作数序列的头端移到栈的头端（对应数据结构栈的 push 操作） 2. 将一个数，从栈的头","description_type":"Markdown"},"platform":"Luogu","limit":{"time_limit":1000,"memory_limit":128000},"difficulty":{"LuoguStyle":"P2"},"is_remote":true,"is_sync":true,"sync_url":null,"sign":"LGP1044"},"statements":[{"statement_type":"Markdown","content":"![](https://cdn.luogu.com.cn/upload/image_hosting/5qxy9fz2.png)\n\n宁宁考虑的是这样一个问题：一个操作数序列，$1,2,\\ldots ,n$（图示为 1 到 3 的情况），栈 A 的深度大于 $n$。\n\n现在可以进行两种操作，\n\n1. 将一个数，从操作数序列的头端移到栈的头端（对应数据结构栈的 push 操作）\n2. 将一个数，从栈的头端移到输出序列的尾端（对应数据结构栈的 pop 操作）\n\n使用这两种操作，由一个操作数序列就可以得到一系列的输出序列，下图所示为由 `1 2 3` 生成序列 `2 3 1` 的过程。\n\n![](https://cdn.luogu.com.cn/upload/image_hosting/8uwv2pa2.png)\n\n（原始状态如上图所示）\n\n你的程序将对给定的 $n$，计算并输出由操作数序列 $1,2,\\ldots,n$ 经过操作可能得到的输出序列的总数。\n\n## Input\n\n输入文件只含一个整数 $n$（$1 \\leq n \\leq 18$）。\n\n## Output\n\n输出文件只有一行，即可能输出序列的总数目。\n\n[samples]\n\n## Background\n\n栈是计算机中经典的数据结构，简单的说，栈就是限制在一端进行插入删除操作的线性表。\n\n栈有两种最重要的操作，即 pop（从栈顶弹出一个元素）和 push（将一个元素进栈）。\n\n栈的重要性不言自明，任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时，想到了一个书上没有讲过的问题，而他自己无法给出答案，所以需要你的帮忙。\n\n## Note\n\n**【题目来源】**\n\nNOIP 2003 普及组第三题","is_translate":false,"language":"English"}],"meta":{"iden":"LGP1044","tags":["动态规划 DP","数学","递推","2003","NOIP 普及组","Catalan 数","栈"],"sample_group":[["3\n","5\n"]],"created_at":"2026-03-03 11:09:25"}}