LETTers比赛第八场:第一题
这个题等价于求将长度为2k的序列A = {1,2,...,2k}划分为两个长度为k的递增子序列B = {b1,b2,...,bk} 和 C = {c1,c2,...,ck},对任意i属于1到k满足bi < ci 的划分方式总数。
一个满足条件的划分等价于:
有两个栈,一个叫A,一个叫B,元素从小到大依次入栈,但是必须满足B栈的长度在任意时刻不小于A栈的长度。比如,如果有六个数1到6,则下图是一种入栈方式:
很明显,这是一个Catalan数了。
View Code
1 #include <stdio.h> 2 const int MAX = 41; 3 long long num[MAX][MAX]; 4 5 void init(){ 6 int i,j; 7 num[0][0] = 1; 8 for(i = 1;i < MAX;i++){ 9 for(j = 0;j <= i;j++){ 10 if(i == j || j == 0){ 11 num[i][j] = 1; 12 } 13 else{ 14 num[i][j] = num[i-1][j-1] + num[i-1][j]; 15 } 16 } 17 } 18 } 19 20 int main() 21 { 22 int n; 23 init(); 24 while(~scanf("%d",&n)){ 25 printf("%I64d\n",num[n][n/2]/(n/2+1)); 26 } 27 return 0; 28 } 29 30