zoukankan      html  css  js  c++  java
  • 【csp2019模拟赛tkh】T1_excatalan

    <前言>

    (这只是一个我们自己的模拟赛啊。。。)

    大佬们可以看看题目。


    <正文>

    简要题意:

    求n对括号匹配中恰好有m对失配的方案数。

    (Solution)

    题外 话:

    首先,我们发现n对括号恰好完全匹配的方案数就是卡特兰数,这个应该是一个常识了(然而我在考试的时候没想出来。。。)

    再看看文件名,扩展卡特兰数,说明我们思路对了但是我们要的是恰好有m对失配的情况,这咋搞呢。

    实际上看似不可做,在求卡特兰数的时候魔改一下公式就可以啦。

    然而为什么呢?

    有一种求卡特兰数的方法叫折线法。

    这种方法有什么妙用呢?

    我们知道一个卡特兰数的模型:在n*n矩阵上不过对角线的左下角到右上角的方案数就是第n项卡特兰数了。

    还有一个模型是进出栈的问题,合法出栈顺序数。

    我们把坐标轴倾斜一下,把对角线贴在x轴上,发现等价于不过x轴的,从原点到2n合法方案数。其中我们走的是一条折线,向上倾表示进栈,下斜表示一次出栈。

    为什么是2n呢?具体我也不会证明,大概就是原本对角线是不能经过的,现在可以经过就要改变终点。

    (以下内容参考这里

    上面有图,可以帮助理解。

    整个过程认为是从坐标(0,0)走到(2n,0)。因为栈内必须要有元素,所以,折线不能在x轴下方,这样才是合法的。

    不合法的方案呢?就是跨过了x轴,但仍然最终到达了终点的方案。

    好的现在我们引入了这个模型,那么根据一些小知识合法方案=总方案-非法方案

    现在我们要求总方案

    即2n次操作,操作种类为2,要求每种操作次数相同,那相当于一个组合数问题,即(frac {(2n)!}{n! imes n!}),也可以写成(inom{2n}{n})

    接下来考虑非法方案

    即至少有一时刻折线处于x轴下方。

    • 对于任意跨越x轴的情况,必有将与(y=-1)相交。

    • 找出第一个与(y=-1)相交的点k,将k点以右的折线根据(y=-1)对称(即操作1与操作2互换了)。可以发现终点最终都会从((2n,0))对称到((2n,-2))

    • 由于对称总是能进行的,且是可逆的。我们可以得出所有跨越了x轴的折线总数是与从((0,0))((2n,-2))的折线总数。

      而后者的操作2比操作1要多(0-(-2)=2)次。即操作1为n-1,操作2为n+1。

    • 总数为(inom{2n}{n-1})

    接下来减一下就可以发现卡特兰数的通项公式了。


    本题题解:

    讲了这么多,和这题有什么关系呢?

    正常卡特兰数不能越过(y=0)线,相当于没有任何一次可以失配的机会。

    本题所求的恰好m对失配,由折线法可以证明是(inom{2n}{n-m}-inom{2n}{n-m-1})

    就好像差分一样嘛!

    这个推广恰好符合扩展卡特兰数,就是正解了。。(然而我考场上还是不会)


    <后记>

    AFO,没什么可说的

  • 相关阅读:
    Java Logging: Log Levels
    Java Logging: Logger Hierarchy
    Java Logging: Logger
    Java Logging: Basic Usage
    Use final liberally
    Writing Final Classes and Methods
    Java Logging: Overview
    base Tag
    DOM Nodes
    Browser environment
  • 原文地址:https://www.cnblogs.com/yywxdgy/p/11847273.html
Copyright © 2011-2022 走看看