fjnu 1392 出栈序列统计

Description

栈是常用的一种数据结构,n个元素组成一个输入序列,在栈顶端一侧等待进栈,栈顶端另一端是出栈序列。已知栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。由这两种操作组成的一个操作序列,可以唯一确定一个出栈序列。假设在输入序列中,没有相同元素。编程计算,对于给定的包含n个元素的输入序列,经过一系列的push和pop操作可能得到的出栈序列总数。
比如,有一个输入序列为:1、2、3,其出栈序列有:
3、2、1
2、3、1
2、1、3
1、3、2
1、2、3
出栈序列的总数为5。

Input

输入的第一行是一个正整数k,表示测试数据组数;接下来是k组测试数据,每组测试数据为一行,包含一个整数n(1<=n<=15),表示输入序列包含元素的个数。

Output

每组测试数据输出一行,包含一个整数,表示可能得到的输出序列总数。

Sample Input


Sample Output


 

KEY:这题有两种方法:一、用公式:C(2n,n)/(n+1);二、有算法:开个数组f,f[0][0]=1;

⑴i>0&&j>0 push f[i][j]=f[i-1][j+1]; ⑵i==0&&j>0 pop f[i][j]=f[i][j-1]; ⑶i>0&&j>0 push,pop f[i][j]=f[i-1][j+1]+f[i][j-1];//其中i表示栈外的元素,j表示栈中的元素;

 

Source:

#include
<iostream>
using namespace std;

int f[20][20]={1,0};

void StackOrderList()
{
    
int i,j;
    
for(i=0;i<=20;i++)
        
for(j=0;j<=20;j++)
        
{
            
if(i>0&&j==0) f[i][j]=f[i-1][j+1];
            
else if(i==0&&j>0) f[i][j]=f[i][j-1];
            
else if(i>0&&j>0) f[i][j]=f[i-1][j+1]+f[i][j-1];
        }

}


int main()
{
    
int N,n;
    StackOrderList();
    cin
>>N;
    
for(int i=1;i<=N;i++)
    
{
        cin
>>n;
        cout
<<f[n][0]<<endl;
    }

    
return 0;
}






 
展开阅读全文

没有更多推荐了,返回首页