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

2
2
3

Sample Output

2
5

 

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;
}






 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值