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             

  

原文地址:https://www.cnblogs.com/LETTers/p/2474299.html