题目: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 (卡特兰数)
原文地址:http://blog.csdn.net/w20810/article/details/47381361