当前位置:编程学习 > C/C++ >>

hdu 2067 小兔的棋盘(卡特兰数)

 

小兔的棋盘

 

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2323    Accepted Submission(s): 1360

Problem Description

小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?小兔想了很长时间都没想出来,现在想请你帮助小兔解决这个问题,对于你来说应该不难吧!

 

Input

每次输入一个数n(1<=n<=35),当n等于-1时结束输入。

 

Output

对于每个输入数据输出路径数,具体格式看Sample。

 

Sample Input

1

3

12

-1

 

Sample Output

1 1 2

2 3 10

3 12 416024

         最基础的卡特兰数(不是大数),直接公式,网上找到其他求法,都写上去了,到时我会对卡特兰数进行一些总结的,先看这个最简单的。

 

代码:

Java代码 

#include <iostream> 

#include <stdio.h> 

#include <memory.h> 

#include <cmath> 

using namespace std; 

 

long long h[45]; 

long long f[45][45]; 

 

void catalan2()     //卡特兰数:第二种求法 

    int i, j; 

    for(i = 1; i <= 36; i++) 

    { 

        f[0][i] = 1; 

    } 

    for(i = 1; i < 36; i++) 

    { 

        for(j = i; j <= 36; j++) 

        { 

            if(i == j) 

            { 

                f[i][j] = f[i-1][j]; 

            } 

            else 

            { 

                f[i][j] = f[i-1][j] + f[i][j-1]; 

            } 

        } 

    } 

 

void catalan()      //卡特兰数:第一种求法 

    int i, j; 

    h[0] = 1; 

    for(i = 1; i < 36; i++) 

    { 

        h[i] = 0; 

        for(j = 0; j <= i; j++) 

        { 

            h[i] += h[j] * h[i-j-1]; 

        } 

    } 

 

int main() 

    int n, zz = 1; 

    catalan(); 

    catalan2(); 

    while(scanf("%d", &n) != EOF) 

    { 

        if(n == -1) break; 

        //h[n]、f[n][n]都是卡特兰数 

        //printf("%d %d %I64d\n", zz++, n, h[n]*2); 

        printf("%d %d %I64d\n", zz++, n, f[n][n]*2); 

    } 

 

    return 0; 

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,