卡塔兰数:杭电HDU题目解析与实现
"这篇文章主要探讨了卡塔兰数(Catalan Number)的原理及其在解决实际问题中的应用,特别是与杭电HDU在线判题系统中的相关题目相结合的实例。" 卡塔兰数是一种在数学中出现的特殊数列,具有多种独特的性质和广泛的应用。它们在组合数学、图论、计算几何等领域都有重要的角色。卡塔兰数的通项公式可以通过多种方式表达,其中一种是递推关系,另一种是组合公式。 递推关系是描述卡塔兰数序列的关键,如描述中提到的: \[ h(n) = \sum_{k=0}^{n-1} h(k) \cdot h(n-k-1) \] 此外,还有一种更为简洁的递推形式: \[ h(n) = \frac{4n - 2}{n + 1} \cdot h(n-1) \] 这个公式指出,第n个卡塔兰数可以通过前一个数乘以一个系数得到。 组合公式同样揭示了卡塔兰数的结构美,它是组合数的特殊比例: \[ h(n) = \frac{(2n)!}{n!(n+1)!} \] 这个公式说明了卡塔兰数可以看作是从2n个不同元素中选择n对进行配对的组合数,然后除以n+1,这是因为每个排列中会有重复的情况。 在给定的代码中,我们看到了一个用于计算卡塔兰数的C++程序。程序首先初始化一个二维数组`catalan`来存储卡塔兰数,并使用递推关系填充数组。`setCatalan()`函数通过迭代计算出所有的卡塔兰数,利用递推公式更新数组的值。最后,主函数`main()`读取用户输入的n值,输出对应的卡塔兰数。 代码中还提到了杭电HDU在线判题系统的两个题目。题目hdoj11342是一个关于特定字符串子序列的问题,这可能涉及到卡塔兰数在解决组合问题时的应用。而题目hdoj1023则与排列组合相关,可能要求求解特定的排列个数,卡塔兰数也可以在解决这类问题时提供帮助。 卡塔兰数不仅在理论上有深远的数学意义,还在实际问题中展现出强大的解决问题的能力。理解并掌握卡塔兰数的概念和应用,对于提升在算法竞赛和组合优化问题中的解题能力大有裨益。
2n个人围成一个圆圈,求两两相互握手并且不交叉的所有握手方式。
这个是卡特兰数的一个例子,设2n个人一共有h(n)种,那么现在第一个人可以和第2,4,6,。。。,2(n-1),2n,即必须保证和他握手的那个人两边是偶数,即为:
h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h0=(4*n-2)/(n+1) *h(n-1),h(0)=1,h(1)=1.
通项公式:h(n)=C(n,2n)/n+1=(2n)!/((n!)*(n+1)!)
但是这个题目是大树,所以必须采用数组模拟乘除法.
#include <iostream>
#include <stdio.h>
using namespace std;
const int N=105;
int catalan[102][N];
void setCatalan()
{
memset(catalan,0,sizeof(catalan));
catalan[1][0]=1;
int i,tmp[N],j,yushu,m;
for(i=2;i<=100;i++)
{
m=4*i-2;
//大数乘法
for(j=0;j<N;j++)
{
catalan[i][j]+=catalan[i-1][j]*m;
if(catalan[i][j]>=10)
{
catalan[i][j+1]+=catalan[i][j]/10;
catalan[i][j]=catalan[i][j]%10;
}
for(j=0;j<N;j++)
tmp[j]=0;
yushu=0;
m=i+1;
//大数/小数
for(j=N-1;j>=0;--j)
{
tmp[j]=(10*yushu+catalan[i][j])/m;
yushu=(10*yushu+catalan[i][j])%m;
}
for(j=0;j<N;++j)
catalan[i][j]=tmp[j];
}
}
int main()
{
setCatalan();
int i,n;
while(cin>>n && (-1 != n))
{
i=N-1;
while(!catalan[n][i])
--i;
for(;i>=0;--i)
cout<<catalan[n][i];
cout<<endl;
}
return 0;
}
剩余5页未读,继续阅读
- 粉丝: 8
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WebLogic集群配置与管理实战指南
- AIX5.3上安装Weblogic 9.2详细步骤
- 面向对象编程模拟试题详解与解析
- Flex+FMS2.0中文教程:开发流媒体应用的实践指南
- PID调节深入解析:从入门到精通
- 数字水印技术:保护版权的新防线
- 8位数码管显示24小时制数字电子钟程序设计
- Mhdd免费版详细使用教程:硬盘检测与坏道屏蔽
- 操作系统期末复习指南:进程、线程与系统调用详解
- Cognos8性能优化指南:软件参数与报表设计调优
- Cognos8开发入门:从Transformer到ReportStudio
- Cisco 6509交换机配置全面指南
- C#入门:XML基础教程与实例解析
- Matlab振动分析详解:从单自由度到6自由度模型
- Eclipse JDT中的ASTParser详解与核心类介绍
- Java程序员必备资源网站大全