题目1547:出入栈

时间限制:1秒
内存限制:32 兆
特殊判题:
提交:742
解决:249



 
题目描述:
 
给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或者入栈。
要求在操作序列的执行过程中不会出现非法的操作,即不会在空栈时执行出栈操作,同时保证当操作序列完成后,栈恰好为一个空栈。
求符合条件的操作序列种类。
例如,4个操作组成的操作序列符合条件的如下:
入栈,出栈,入栈,出栈
入栈,入栈,出栈,出栈 
共2种。

输入:

输入包含多组测试用例,每组测试用例仅包含一个整数n(1<=n<=1000)。

输出:

输出仅一个整数,表示符合条件的序列总数,为了防止总数过多超出int的范围,结果对1000000007取模(mod 1000000007)。

样例输入:
2
4
10
样例输出:
       1
         2
         42
 
 

状态F[i][j]表示入栈i次,出栈j次的序列总数,其中i>j。

 

#include<stdio.h>
const int MAX=500;
long f[501][501];
int main()
{
    int n;
    for (int i=1;i<=MAX;i++)
        f[i][0]=1;
    for (int i=1;i<=MAX;i++)
        for (int j=1;j<=i;j++)
        {
            f[i][j]=f[i-1][j]+f[i][j-1];
            f[i][j]=f[i][j]%1000000007;
        }
    while(scanf("%d",&n)!=EOF)
    {
        if (n%2==1) printf("0\n");
        else printf("%d\n",f[n/2][n/2]);
    }
    return 0;
}

 

 

posted on 2014-03-17 20:54  武晓伟  阅读(164)  评论(0编辑  收藏  举报