【Catalan数】HDU-4165 Pills

在这里插入图片描述
在这里插入图片描述

注解

1、Catalan数的应用(类似于hdu1023,hdu1130)。Catalan(n)=\sum{Catalan(k-1)Catalan(n-k)},k=1,2,…,n
2、常见的Catalan数应用:n个数组成的栈的出栈序列个数Catalan(n);n个-1和n个1组成的字符串,2n位的和大于等于0的个数Catalan(2n);n*n的格子,只在上(下)对角线走,走到(n,n)的走法数目Catalan(n)
3、Catalan数也有其他形式的表示:
如用组合数表示:
Catalan(n)=Combination(2n, n) - Combination(2n, n-1)
Catalan(n)=Combination(2n, n) / (n+1)
如用递推式表示:
Catalan(n)=Catalan(n-1) *(4n-2) / (n+1)
4、本题的模型是:n个药片,每个药片可以掰成两半。每天吃半片(可能是掰开的,也可能是整个的),问n个药片吃完,有多少种情况?
5、与本题类似的模型:有N个红球,N个白球,问这2N个小球的排列数,且从第一个球到后面任意个球中红球的个数必须不小于白球的个数(理解为白球是红球产生的,一个红球产生一个白球)。

代码

#include <iostream>
#include <cstring>

using namespace std;

typedef long long int LL; 

const int maxn = 30;

LL a[maxn+1];

void init(){
	memset(a, 0, sizeof(a));
	a[0] = 1;
	a[1] = 1;
	for(int i=2; i<=maxn; i++){
		for(int j=0; j<i; j++){
			a[i] += a[j]*a[i-j-1];
		}
	}
}

int main() {
	init();
	int n;
	cin>>n;
	while(n){
		cout<<a[n]<<endl;
		cin>>n;
	}
    return 0;
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值