1139: 出栈序列统计
Description
栈是常用的一种数据结构,有n令元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两•种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数 。Input
一个整数n(1 <= n <= 15)Output
一个整数,即可能输出序列的总数目。Sample Input
3Sample Output
5数学题,卡特兰数。C(2n,n)=(2n)!/[(2n-n)!n!]
最多步骤时出栈入栈各 n 次,则其总步骤有2 * n次。
而一般 出栈次数<=入栈次数 。
这样我们可以令1表示进栈,0表示出栈,则可转化为求一个2n位、含n个1、n个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数。显然含n个1、n个0的2n位二进制数共有(2n , n)个。
#include<cstdio> #include<cstring> #include<iostream> #include<utility> #include<string> #include<vector> #include<algorithm> #include<queue> #include<cstdlib> #include<cmath> #include<stack> using namespace std; int main() { #ifndef ONLINE_JUDGE freopen("1.txt","r",stdin); #endif <span style="white-space:pre"> </span> int i , flag[20] , n ; scanf("%d",&n) ; flag[0] = 1 ; flag[1] = 1 ; for(i = 2 ; i<=n ; ++i) { flag[i]=flag[i-1]*(4*i-2)/(i+1); } printf("%d\n",flag[n]); return 0; }
1139: 出栈序列统计
最新推荐文章于 2020-11-30 21:46:07 发布