zoukankan      html  css  js  c++  java
  • 卡特兰数

    “我经常有那种感觉,如果这个事情来了,你却没有勇敢地去解决掉,它一定会再来。生活真是这样,它会一次次地让你去做这个功课直到你学会为止。” —— 《像我这样笨拙地生活》

    卡特兰数(Catalan number)是 组合数学 中一个常出现在各种 计数问题 中的 数列。

    ​数列的前几项为:1,1, 2, 5, 14, 42, 132, 429, 1430, 4862,...

    题目描述:

    n 个元素进栈序列为:1,2,3,4,...,n,则有多少种出栈序列。

    思路:

    我们将进栈表示为 +1,出栈表示为 -1,则 1 3 2 的出栈序列可以表示为:+1 -1 +1 +1 -1 -1。

    假设非法序列为 A,对应的序列为 B。每个 A 只有一个"第一个前缀和小于 0 的前缀",所以每个 A 只能产生一个 B。而每个 B 想要还原到 A,就需要找到"第一个前缀和大于 0 的前缀",显然 B 也只能产生一个 A。

    #include <cstdio>
    using namespace std;
    long long catalan[1000005];
    int main()
    {
        int n;
        scanf("%d", &n);
        catalan[0] = catalan[1] = 1;
        for (int i = 2; i <= n; i++)
            for (int j = 0; j <= i - 1; j++)
                catalan[i] += catalan[j] * catalan[i - j - 1];
        printf("%lld\n", catalan[n]);
        return 0;
    }
    

      我有罪,从此与省二失之交臂。这一次就是在赛场上没认出来。关于括号的排列组合,在使劲想转移方程,卡了3h。

  • 相关阅读:
    SqLite 框架 GreenDAO
    HttpClient的使用
    android事件分发介绍
    Android常见开发思路
    AndroidStudio学习记录
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo异常总结
    开源Pull_To_Refresh控件使用
    自定义控件ViewPagae<
    白龙软件商店面试问题整理
    基于anyrtc的sdk实现直播连麦互动
  • 原文地址:https://www.cnblogs.com/thx2199/p/15627832.html
Copyright © 2011-2022 走看看