【模考3】笨笨连线游戏

【题目描述】

一天,妈妈在黑板上画了一个大大的圆,然后又在圆弧上标上123...,2N个数。然后让笨笨任意选取一对数(两个不同的数)上连一条直线。然后再任意选取一对数,再边一条直线,但这条直线不能和任何别的直线相交。每个数都要恰好与另一个数连一条直线。

笨笨费了好大的劲才找出一种连线方案。妈妈在旁边问笨笨:给出N,请问不同的连线方案有多少种呢?

笨笨算不出来,只好请教作为大牛的你。

【输入】

多组数据,每组数据的格式为:

1行:1个整数N1<= N <= 150),表示在圆弧上会标记2N个数

当输入的N0时,表示输入结束

【输出】

每组输入对应输出一行,一个整数,表示连线的方案数。由于结果太大,只保留模10007后的余数。

【样例输入】

0  

【样例输出】

2

5


【分析】

考试时,看到这道题,我早已一脸懵逼。于是,也就一脸懵逼地用回朔法来做。但觉得实现难度太大,便放弃了。


实际上,这是一道典型的递推题。


我们从一号点开始,与最后一个点相连。那么,整个圆便被分为两部分:0个点和n-2个点。

根据乘法原理,这么连,n个点的连线方案数就是0个点的方案数+(n-2)个点的方案数的乘积。

将这条线向下平移,就可以用同样的方法,求这么连的方案数。将它们相加,便是答案。


具体方法如下:

设f(n)为(2 * n)个点的方案数。

则递推式为:

f(n) = f(0) + f(n - 2) + f(1) + f(n - 2) + ... + f(n - 2) + f(0)

边界条件为:

f(1) = 1;     f(0) = 1(不连便是一种方案)


【程序】















#include<cstdio>
int f[155];
int main()
{
	freopen("route.in", "r", stdin);
	freopen("route.out", "w", stdout);
	int n, i, j, c = 1;
	f[0] = f[1] = 1;
	while(~scanf("%d", &n))
	{
		if(n == 0)
			return 0;
		if(c >= n)
		{
			printf("%d\n", f[n]);
			continue;
		}
		for(i = c + 1; i <= n; i++)
		{
			for(j = 0; j < i; j++)
			{
				f[i] += (f[j] * f[i - j - 1]);
				f[i] %= 10007;
			}
		}
		printf("%d\n", f[n]);
		c = n;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值