九度 1547:出入栈 (二维DP)
思路
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\n", 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\n", cal(n));
}
return 0;
}

浙公网安备 33010602011771号