fjnu1392出栈序列总数

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表示栈中的元素;

理解突破口:f[i][j]=f[i-1][j+1]+f[i][j-1];

//当栈内外都有元素则=俩来源(入栈的数量(f[i-1][j+1]:待入栈的栈外的元素少一个,栈中的元素多一个(因为是逆着推出的f[i][j]))+出栈的数量(f[i][j-1]:待入栈的栈外的元素不变,栈中的元素出一个(因为是逆着推出的f[i][j]))

#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;
}
来自:http://blog.csdn.net/killua_hzl/article/details/2114096

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值