网站空间关闭了怎么办,网站后期维护需要怎么做,国内好的crm系统,网站管理系统设置问题描述#xff1a;卡塔兰数#xff0c;是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n#xff0c;计算h(n)。其递归式如下#xff1a;h(n) h(0)*h(n-1)h(1)*h(n-2) ... h(n-1)h(0) (其中n2#xff0c;h(0) h(1) 1) 该递推关系的解为… 问题描述卡塔兰数是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n计算h(n)。其递归式如下h(n) h(0)*h(n-1)h(1)*h(n-2) ... h(n-1)h(0) (其中n2h(0) h(1) 1) 该递推关系的解为h(n)C(2n,n)/(n1) (n1,2,3,...) 思路直接根据递归式写出相应的算法。 参考代码//函数功能: 计算Catalan的第n项//函数参数: n为项数//返回值: 第n个Catalan数int Catalan(int n){ if(n 1) return 1; int *h new int [n1]; //保存临时结果 h[0] h[1] 1; //h(0)和h(1) for(int i 2; i n; i) //依次计算h(2),h(3)...h(n) { h[i] 0; for(int j 0; j i; j) //根据递归式计算 h(i) h(0)*h(i-1)h(1)*h(i-2) ... h(i-1)h(0) h[i] (h[j] * h[i-1-j]); } int result h[n]; //保存结果 delete [] h; //注意释放空间 return result;}应用1描述n对括号有多少种匹配方式 思路n对括号相当于有2n个符号n个左括号、n个右括号可以设问题的解为f(2n)。第0个符号肯定为左括号与之匹配的右括号必须为第2i1字符。因为如果是第2i个字符那么第0个字符与第2i个字符间包含奇数个字符而奇数个字符是无法构成匹配的。 通过简单分析f(2n)可以转化如下的递推式 f(2n) f(0)*f(2n-2) f(2)*f(2n - 4) ... f(2n - 4)*f(2) f(2n-2)*f(0)。简单解释一下f(0) * f(2n-2)表示第0个字符与第1个字符匹配同时剩余字符分成两个部分一部分为0个字符另一部分为2n-2个字符然后对这两部分求解。f(2)*f(2n-4)表示第0个字符与第3个字符匹配同时剩余字符分成两个部分一部分为2个字符另一部分为2n-4个字符。依次类推。 假设f(0) 1计算一下开始几项f(2) 1, f(4) 2, f(6) 5。结合递归式不难发现f(2n) 等于h(n)。 应用2描述矩阵链乘 Pa1×a2×a3×……×an依据乘法结合律不改变其顺序只用括号表示成对的乘积试问有几种括号化的方案 思路可以这样考虑首先通过括号化将P分成两个部分然后分别对两个部分进行括号化。比如分成(a1)×(a2×a3.....×an)然后再对(a1)和(a2×a3.....×an)分别括号化又如分成(a1×a2)×(a3.....×an)然后再对(a1×a2)和(a3.....×an)括号化。 设n个矩阵的括号化方案的种数为f(n)那么问题的解为 f(n) f(1)*f(n-1) f(2)*f(n-2) f(3)*f(n-3) f(n-1)*f(1)。f(1)*f(n-1)表示分成(a1)×(a2×a3.....×an)两部分然后分别括号化。 计算开始几项f(1) 1, f(2) 1, f(3) 2, f(4) 5。结合递归式不难发现f(n)等于h(n-1)。 应用3描述一个栈(无穷大)的进栈序列为123…n有多少个不同的出栈序列? 思路这个与加括号的很相似进栈操作相当于是左括号而出栈操作相当于右括号。n个数的进栈次序和出栈次序构成了一个含2n个数字的序列。第0个数字肯定是进栈的数这个数相应的出栈的数一定是第2i1个数。因为如果是2i那么中间包含了奇数个数这奇数个肯定无法构成进栈出栈序列。 设问题的解为f(2n) 那么f(2n) f(0)*f(2n-2) f(2)*f(2n-4) f(2n-2)*f(0)。f(0) * f(2n-2)表示第0个数字进栈后立即出栈此时这个数字的进栈与出栈间包含的数字个数为0剩余为2n-2个数。f(2)*f(2n-4)表示第0个数字进栈与出栈间包含了2个数字相当于1 2 2 1剩余为2n-4个数字。依次类推。 假设f(0) 1计算一下开始几项f(2) 1, f(4) 2, f(6) 5。结合递归式不难发现f(2n) 等于h(n)。 应用4描述n个节点构成的二叉树共有多少种情形 思路可以这样考虑根肯定会占用一个结点那么剩余的n-1个结点可以有如下的分配方式T(0, n-1),T(1, n-2),...T(n-1, 0)设T(i, j)表示根的左子树含i个结点右子树含j个结点。 设问题的解为f(n)那么f(n) f(0)*f(n-1) f(1)*f(n-2) ....... f(n-2)*f(1) f(n-1)*f(0)。假设f(0) 1那么f(1) 1, f(2) 2, f(3) 5。结合递推式不难发现f(n)等于h(n)。 应用5描述在圆上选择2n个点将这些点成对连接起来使得所得到的n条线段不相交的方法数 思路以其中一个点为基点编号为0然后按顺时针方向将其他点依次编号。那么与编号为0相连点的编号一定是奇数否则这两个编号间含有奇数个点势必会有个点被孤立即在一条线段的两侧分别有一个孤立点从而导致两线段相交。设选中的基点为A与它连接的点为B那么A和B将所有点分成两个部分一部分位于A、B的左边另一部分位于A、B的右边。然后分别对这两部分求解即可。 设问题的解f(n)那么f(n) f(0)*f(n-2) f(2)*f(n-4) f(4)*f(n-6) ......f(n-4)*f(2) f(n-2)*f(0)。f(0)*f(n-2)表示编号0的点与编号1的点相连此时位于它们右边的点的个数为0而位于它们左边的点为2n-2。依次类推。 f(0) 1, f(2) 1, f(4) 2。结合递归式不难发现f(2n) 等于h(n)。 应用6描述求一个凸多边形区域划分成三角形区域的方法数 思路以凸多边形的一边为基设这条边的2个顶点为A和B。从剩余顶点中选1个可以将凸多边形分成三个部分中间是一个三角形左右两边分别是两个凸多边形然后求解左右两个凸多边形。 设问题的解f(n)其中n表示顶点数那么f(n) f(2)*f(n-1) f(3)*f(n-2) ......f(n-2)*f(3) f(n-1)*f(2)。f(2)*f(n-1)表示三个相邻的顶点构成一个三角形那么另外两个部分的顶点数分别为2和n-1。 设f(2) 1那么f(3) 1, f(4) 2, f(5) 5。结合递推式不难发现f(n) 等于h(n-2)。 应用7描述有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票另外n人只有10元钞票剧院无其它钞票问有多少中方法使得只要有10元的人买票售票处就有5元的钞票找零 思路可以将持5元买票视为进栈那么持10元买票视为5元的出栈。这个问题就转化成了栈的出栈次序数。由应用三的分析直接得到结果f(2n) 等于h(n)。参考来自 http://blog.csdn.net/wuzhekai1985还有个扩展是super Catalan 资料不容易找到以下是老美的一点介绍记住公式即可http://mathworld.wolfram.com/SuperCatalanNumber.html