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