九度 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
", 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;
}

  

原文地址:https://www.cnblogs.com/zhouzhuo/p/3645987.html