一、Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n,n=1,2,3,...(其中C(2n-2,n-1)表示2n-2个中取n-1个的组合数)
问题描述:
2n个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?#include <iostream.h> int count = 0; //计数器 /**************输出数组***********/ void Print(int a[], int b[],int n) { for (int j = 0; j < n/2; j++) { cout<<a[j]<<" "; } cout<<endl; for (j = 0; j < n/2; j++) { cout<<b[j]<<" "; } cout<<endl<<endl; } void Cattleya(int up, int down,int x, int n,int a[], int b[])//up down 分别表示上下数组已填的个数,x表示要填的数 { //a[] b[] 表示上下数组 if (up == n/2) //当上数组填满时找到一种情况 { for (int w = down; w < n/2; w++) //当上数组确定,下数组也确定,填充下数组 { b[w] = n/2+w+1; } count++; Print(a,b,n);//输出结果 return ; } if (up == down) //上下数组已填个数相等时 填上数组 { a[up] = x+1; Cattleya(up+1, down, x+1,n,a,b); } else { a[up] = x+1; Cattleya(up+1, down, x+1,n,a,b); b[down] = x+1; Cattleya(up, down+1, x+1,n,a,b); } } void main() { int n; cout<<"请输入n的大小:"; cin>>n; int *a = new int(n); int *b = new int(n); Cattleya(0,0,0,n*2,a,b); cout<<"一共有"<<count<<"种解法!"<<endl; }
卡特兰数------2行n列排队问题
猜你喜欢
转载自blog.csdn.net/weixin_37267014/article/details/78393503
今日推荐
周排行