思路
1. dp[i][j] 表示前 i 个操作中有 j 个入栈操作的方案数
2. dp[i][j] = dp[i-1][j-1] + dp[i-1][j], 其中 j >= i/2.
3. 为了方便起见, 非法的状态为 0, 比如 dp[3][1] = 0
代码
/* * source.cpp * * Created on: 2014-4-4 * Author: vincent */ /* * dp[i][j] 前 i 个操作中有 j 个入栈操作的种类 * dp[i][j] = dp[i-1][j-1] + dp[i-1][j] * 其中, (i-j) <= j */ #include <iostream> #include <memory.h> #include <stdio.h> #include <math.h> using namespace std; int dp[1010][1010]; int cal(int n) { memset(dp, 0, sizeof(dp)); dp[1][1] = 1; dp[2][1] = 1; for(int i = 2; i <= n; i ++) { for(int j = (i>>1); j <= i; j ++) { if(i - 2*j <= 0) { dp[i][j] = (dp[i-1][j] + dp[i-1][j-1])%(1000000007); //printf("dp[%d][%d] = %d ", i, j, dp[i][j]); } } } return dp[n][n>>1]; } int main() { freopen("input.txt", "r", stdin); int n; while(scanf("%d", &n) != EOF) { printf("%d ", cal(n)); } return 0; }