CSU 1320 Scoop water【卡特兰数】

来源:互联网 发布:shell 数组函数 编辑:程序博客网 时间:2024/05/17 04:01

1320: Scoop water

Time Limit: 2 Sec  Memory Limit: 128 MB
Submit: 912  Solved: 269
[Submit][Status]

Description

  zzy今天刚买了两个水瓢A和B,容量都是为1升,童心未泯的他打算用这个水瓢来玩游戏。

  首先zzy准备了一个容量可看作无穷大的水缸,刚开始水缸是空的,然后用水瓢A往水缸里加水,用水瓢B把水缸里的水舀出去,当使用 水瓢B把水舀出去时水缸里必须要至少有1升的水。这样子使用N次水瓢A,也使用N次水瓢B,最后水缸会依旧空的。

Input

  输入有多个例子,直到文件结束。

  每个例子仅含一个数N(0<N<=10000),表示你必须使用N次A水瓢和N次B水瓢。

Output

  对于每个例子,请输出一个数,表示一共有多少种正确的舀水方式使得舀水过程中 使用B水瓢时水缸里总会有足够的水。

 (由于数字比较大,输出的答案模1000000007)

Sample Input

12

Sample Output

12

HINT

CSU_CX

Source

CSU Monthly 2013 Oct.


思路:


一个入的水舀,一个出的水舀,相当于出栈和入栈的顺序。

经典的卡特兰数问题。

因为N并不大,所以我们可以O(N^2)预处理出来结果。

O(1)查询即可。


Ac代码:


#include<stdio.h>#include<string.h>using namespace std;#define ll long long int #define mod 1000000007ll dp[10005];void init(){    dp[0]=1;    for(int i=1;i<=10000;i++)    {        for(int j=0;j<i;j++)        {            dp[i]+=dp[j]*dp[i-j-1];            dp[i]%=mod;        }    }}int main(){    init();    int n;    while(~scanf("%d",&n))    {        printf("%lld\n",dp[n]);    }}







0 0