• HDOJ 1023 Train Problem II 卡特兰数


    火车进站出站的问题满足卡特兰数...卡特兰数的相关知识如下:

    卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。

    前几项为 (OEIS中的数列A000108): 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...

    令h(1)=1,h(2)=1,catalan数满足递归式:

    例如:h(3)=h(1)*h(2)+h(2)*h(1)=1*1+1*1=2

     h(4)=h(1)*h(3)+h(2)*h(2)+h(3)*h(1)=1*2+1*1+2*1=5

    h(0)=1;h(1)=1;h(2)=2;h(3)=5;  ····有另类的递归式

    另类递归式:

      h(n)=h(n-1)*(4*n-2)/(n+1);

      该递推关系的解为:

    h(n)=C(2n,n)/(n+1) (n=1,2,3,...)

    可以看出卡特兰数是一个大数据的问题,处理大数据问题一般是将数据的各位存放在一个数组中....

     1 //h( n ) = ( ( 4*n-2 )/( n+1 )*h( n-1 ) );
     2 
     3 
     4 #include<stdio.h>
     5 
     6 //*******************************
     7 //打表卡特兰数
     8 //第 n个 卡特兰数存在a[n]中,a[n][0]表示长度;
     9 //注意数是倒着存的,个位是 a[n][1] 输出时注意倒过来。 
    10 //*********************************
    11 int a[105][100];
    12 void ktl()
    13 {
    14     int i,j,yu,len;
    15     a[2][0]=1;
    16     a[2][1]=2;
    17     a[1][0]=1;
    18     a[1][1]=1;
    19     len=1;
    20     for(i=3;i<101;i++)
    21     {
    22         yu=0;
    23         for(j=1;j<=len;j++)
    24         {
    25             int t=(a[i-1][j])*(4*i-2)+yu;
    26             yu=t/10;
    27             a[i][j]=t%10;
    28         }    
    29         while(yu)
    30         {
    31             a[i][++len]=yu%10;
    32             yu/=10;
    33         }
    34         for(j=len;j>=1;j--)
    35         {
    36             int t=a[i][j]+yu*10;
    37             a[i][j]=t/(i+1);
    38             yu = t%(i+1);
    39         }        
    40         while(!a[i][len])
    41         {
    42             len--;
    43         }    
    44         a[i][0]=len;
    45     }    
    46     
    47 }    
    48 int main()
    49 {
    50     ktl();
    51     int n;
    52     while(scanf("%d",&n)!=EOF)
    53     {
    54         for(int i=a[n][0];i>0;i--)
    55         {
    56             printf("%d",a[n][i]);
    57         }    
    58         puts("");
    59     }    
    60     return 0;
    61 }
  • 相关阅读:
    今天开始学习WCF了开发环境的配置
    我的文章《DLL封装登录框架实现代码复用》终于要发表了
    python小练习给右键菜单添加用chrome打开
    手动创建oracle数据库
    Sublime Text 2中如何输入中文
    转 用Python画Mandelbrot集
    Win7 64位安装Python PIL库
    推荐一本有关设计的好书《写给大家看的设计书》
    坚持做自己
    更新专业版显卡驱动导致ubuntu无法进入桌面环境
  • 原文地址:https://www.cnblogs.com/kb342/p/3723272.html
Copyright © 2020-2023  润新知