递推之凸n边形的不同划分方式

描述

卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名。

最初,给卡塔兰数建立的数学模型是:一个凸n边形,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形,不同的拆分数目用hn表示,hn即为Catalan数。例如五边形有如下五种拆分方案(如图),故h5=5。求对于一个任意的凸n边形相应的hn


递推之凸n边形的不同划分方式_第1张图片

输入一个正整数n,代表凸n边形的边数 (2≤n≤37)输出一个正整数,凸n边形划分成若干三角形的不同划分方式

样例输入

样例输入一:4
样例输入二:5
样例输出
样例输出一:2
样例输出二:5
提示

找出递推式,三角形可认为是独立的1种拆分方式

解题思路

    你可以百度一下什么是卡特兰数(据说卡特兰是通过找到凸n边形划分成若干三角形的不同划分方式的规律发现了卡特兰数,忽略这句话),接下来我回来引导你找到这个递推规律。

    首先,画一个凸n边形(我不可能真的给你画一个n边形吧?),如下图所示

递推之凸n边形的不同划分方式_第2张图片

    如上图所示,我画了一个凸n边形,我设凸n边形的不同划分方式为h(n)种。凸n边形的每一个角都编上号,从1到n。现在固定住1和n角,在其它顶点上任意选一个顶点j连接1、j和n、j,发现把这个凸n边形分成了三个形状,第一个是一个j边形,第二个是一个三角形,第三个是一个n-j+1边形。我们知道j边形有h(j)不同划分方式n-j+1边形有h(n-j+1)种不同划分方式,所以对于这个j顶点来说有h(j)*h(n-j+1)种不同的划分方式。对于所有的j(2到n-1)来说,就是凸n边形所有的不同划分方式,数量应为

参考程序
#include
using namespace std;
long long h[40];//要用long long型,要不然会爆
int main()
{
	int i,j,n;
	h[0]=1,h[1]=1;h[2]=1;//初始值设置好
	cin>>n;
	for(i=3;i<=n;i++)//
		for(j=2;j<=i-1;j++)//j从2到n
			h[i]+=h[j]*h[i-j+1];//递推公式
	h[2]=0;//没有2边形,把h[2]置为0
	cout<

你可能感兴趣的:(递推)