码迷,mamicode.com
首页 > 其他好文 > 详细

LA 5092 && hdu 3723 Delta Wave (卡特兰数)

时间:2015-08-10 00:24:09      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:卡特兰数   java   

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3723 and http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20568

题意:有种折线每向右延伸一个单位长度,高度要么不变,要么加1,要么减1。而且任何时刻高度不能低于0。求这种折线最终高度为0的情况总数。

分析:由于任何时刻斜向上的线不小于斜向下的线的数目,而且最终相等,,,,,卡特兰数模型。卡特兰数资料 若有i条斜向上的线,那么同样会有i条斜向下的线,方案数就是catalan(i),由于还有n-2*i条水平直线,将这些水平直线任意放的方案数为C(n,n-2*i)=C(n,2*i),那么对于有i条斜向上的线的总方案数有:S(i)=C(n,2*i)*catalan(i)。但是从0~n/2枚举斜向的线,然后每一个单独计算,时间复杂度比较高,可以考虑直接由S(i-1)计算S(i),通过化简可以得到S(i)=S(i-1)*(n-2*i+2)*(n-2*i+1)/(i*(i+1))。

代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin = new Scanner(System.in);
		while(cin.hasNext())
		{
			int n=cin.nextInt();
			BigInteger ans=(BigInteger.ONE);
			BigInteger cur=(BigInteger.ONE);
			for(int i=1;i<=n/2;i++)
			{
				cur=cur.multiply(BigInteger.valueOf(n-2*i+2)).multiply(BigInteger.valueOf(n-2*i+1));
				cur=cur.divide(BigInteger.valueOf(i*i+i));
				ans=ans.add(cur);
			}
			System.out.println(ans.mod(BigInteger.TEN.pow(100)));
		}
	}

}


LA 5092 && hdu 3723 Delta Wave (卡特兰数)

标签:卡特兰数   java   

原文地址:http://blog.csdn.net/w20810/article/details/47381361

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!