模拟考试9.3-笨笨连线游戏(route.cpp)

【题目描述】

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

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

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

【输入】

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

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

当输入的N为0时,表示输入结束。

【输出】

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

【样例输入】

2

3

【样例输出】

2

5

 

 

【解题思路】

1、递推

2、本题的思路类似“Catalan数”

(1)当n=0时,f(0)=1;

(2)当n=1时,f(1)=1;

(3)当n=2时,f(2)=f(0)*f(1)+f(1)*f(0)=2;

 解释:当n=2时,从1号点出发划一条直线的方案是f(1-1)*f(2-1),从2号点出发划一条直线的方案是f(2-1)*f(2-2),总方案是从1号和2号点出发方案之和。以此类推:

(4)当n=3时,f(3)=f(1-1)*f(3-1)+f(1)*f(3-2)+f(2)*f(3-3);

(5)F(n)=f(0)*f(n-1)+f(1)*f(n-2)+...+ f(n-1)*f(0)

 

 

1号点可以与偶数点连接。然后就分成了两个部分。然后。不解释了。

直接上代码...........

 

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

很简短而又简单对吧.................

 

然而考试的时候我就是没想到...................omg居然这么简单我也是分分钟拒绝的。

由于结果会溢出,所以要边算边模.........

然后........没什么可说的了吧= =

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值