la5028

此题是hdu3723

此题首先想有点像栈,因为最后要回到第一排。所以向上一个必然向下一个,这就有点像栈进去一个出来一个。然后呢,求组合个数。那这是不是就是卡特兰数呢?今天正好看了组合数学卡特兰数。

那么上下是卡特兰数的个数,这里还有横线的个数,横线可以理解为在上下中插入横线。比方说:n=4的时候,在上的个数为1下的个数为1的时候,卡特兰数为1,那么还余下2个位置需要放横线,横线插入到里面的方案数就是C(4,2)=6。然后上下个数各为2的时候那么横线数是0,方案数是2,同样还有一个上下个数各为1的时候为1种方案。

那么通项公式就是

S(n)=S(n-1)+f(n)其中f(n)为当前上下个数的组合数。这里关键就是求组合数。

组合数f(n)=Ci*C(n,n-2*i)其中Ci是卡特兰数,C(n,n-2*i)是放横线的个数

但是此处求f(n)到了n比较大的时候就无穷大了,所以需要用到大数。那么大数求C比较繁琐,我们应该找到递归式子,然后递推求出那么将f(i)/f(i-1)=4(i-2)/(i+1) * n!/((n-n+2i)!(n-2i)!)  /   n!/((n-n+2i-2)!(n-2i+2)!)请自己化简后得:

((4i-2)(n-2i+1)(n-2i+2))/((i+1)(2i-1)2i)然后用大数求出来就可以了。

f(n)=f(n-1)*(n-2i+1)(n-2i+2)/(i*(i+1))

此题我用java做的因为用c++写乘法和除法太过麻烦我就选择了java,代码很短,不超过15行 1秒左右。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值