设为首页 加入收藏

TOP

hdu 2067 小兔的棋盘(卡特兰数)
2014-11-23 22:53:52 来源: 作者: 【 】 浏览:3
Tags: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

#include

#include

#include

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语言高级编程-函数前置与后置调.. 下一篇 日期/时间校验(yyyyMMddHHmmss)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: