卡特兰数,prufer序列与树上计数。

卡特兰数的判别方式一般是这样,找到一个一分为2的点,找递推算式,或者是证明在某一点处之前,某种定义的量不少与另外一种定义的量。找递推算式与树上计数问题相关,和dp相关。
把题目的描述改为更加接近数学语言的描述,会起到较好的效果。
1.
在这里插入图片描述
这个问题找到分割点后再找递推算式显然很难,那就想办法证明不少于某些量这样的关系。
奇数项递增,偶数项递增,那么把1到n这样的递增的数依次放入时,放入奇数项的记为操作1,放入偶数项的记为操作0,要想满足奇数项小于偶数项,那么在前x次放数放入前x个位置中,如果在第k次操作之前,操作0的次数要多余操作1的次数,那么,由于偶数项前一定是奇数项,对于前k位来说,偶数项先与奇数项被沾满,则得到一定有奇数项大于偶数项。那么这就证明了前k次中,1的操作次数要大于0的操作次数。那么为卡特兰数。写成dp的话就是dp(i)(j)表示前i+j次操作中,i操作多于j操作的方案数。然后转化成走方格的形式,1表示向左走,0表示向上走,就变成了不越过i<=j这条线的走到(n,n)的方案数。这道题的关键是描述的转换,把杂乱的条件用近似数学性的语言描述出来,就方便多了,所以一开始要用操作1与操作0来重新定义问题,描述的漂亮了,规范了,就前进了一大步。
2. 在这里插入图片描述
这个的分割点很明显,树根,那么设f(x)表示当x个点时,有的结构数,那么就有递推算式f(x)=f(x-k-1)*f(k), 把深度加入,考虑f(x)(y),那么原f(x)的含义就是小于等于最大深度时,所有的种类数,那么f(x)(y)就表示小于等于深度y时x个点的所有种类数,进一步,左右儿子加上根节点相当于深度加一,于是f(x)(y)=f(x-1-k)(y-1)*f(k)(y-1),找到这个递推函数的头,就行了。这个题如果一开始这样说,f(x)(y)表示深度为y的有x个点的方案数,给出x,y,求f(x)(y)的值,那么,就容易了一大步。也就是说,恰当的把题目翻译成数学描述,会向前推进一大步。
3.

http://codeforces.com/contest/1475/problem/D
比如说那天比赛的这个题目,这个题目最坑人的地方在于一开始就想错了,很容易想把两种不同贡献的数混在一起考虑,但是如果把题目翻译成这样,设f(x),x=一些值时f(x)=1, x=另外一些值时,f(x)=2;求x的和大于等于m时,f(x)值的和的最小值,那么,绝对没人会想着两种贡献的值混在一起考虑,一旦想到分开考虑,这个题目就简单多了,另设两个和函数,求出前缀和,数组下标=贡献值,枚举其中一个前缀和,讨论另一个前缀和,不断更新贡献值。
或者很容易看出这样的关系,x1+x2<x3,f(x3)=2=f(x1)+f(x2),显然m-x3<m-x1-x2;而x1+x2>=x3,
时,不能直接加x1+x2,因为x4+x2有可能<x3且f(x4)+f(x2)=f(x3); 然后就行了。 把题目条件改成函数的形式描述,剩下的东西差不多都是显然。
4.
在这里插入图片描述
这个问题用purfer很容易解决,但是也可以这样。
这个问题先设个函数,设s(x)=在没有方向时,x的种类数,加上方向,就是每个树上的每个点都能当根节点,就是x*s(x);求出s(x),就大功告成。还是一分为二,有三个点,标号1,2,3 ,1,2为一堆,3为一堆,此时固定1,2中的2点不动,剩下的点中选出i个补充到另外一堆,那么种类数为s(i+1) *c(n-2,i) , 然后再在这些点中选出一个连接点来,连接到固定点2上,那么就是s(i+1)*c(n-2,i)*c(i+1,1),由于先前的那一堆有s(n-i-1)种形态,那么,就是s(i+1)c(n-1,i)c(i+1,1)s(n-i-1),那么就有递推算式s(n)=c(n-2,0)c(1,1)s(n-1)s(1)+c(n-2,1)c(2,1)s(n-2)s(2)+…+c(n-2,n-2)c(n-1,1)s(1)s(n-1),s(1)=1。 可以试验三个点,四个点都行,而且可以由两个点推出三个点,三个点推出四个点,那么把头找到,就可得递推算式s(x)=x^(x-2); 这样就得到了一个很有意思的等式,感觉上符合数学归纳法,所以正确。答案可以dp也可以直接求。 关键还是函数形式去代换。
5.
在这里插入图片描述
这个题,设两个函数,f(x)表示卡特兰数,g(x)表示叶子数目,概率就是g(x)/f(x),由于f(x)知道,g(x)未知,但是f(x-1) 可以看成x点的图有k个叶子,除去任意一个叶子,得到f(x-1)个图,而x-1个点的图加上叶子,则得到f(x)个图,这样就建立了双向映射,且由x-1个图加叶子时,有x个点能加,总度数为2
x-2,2
x-(x-2)=x;所以有x
f(x-1)=g(x);
这个很难想到,但是递推公式容易一些,因为点数很容易分割,有x-i-1和i ,则z(x-i-1)z(i) ,那么点数不变时表示方案数。而叶子又需要枚举,那么叶子节点也可以分割后相乘。
g(x)(y)表示x个点时,有y个叶子的方案数,那么就是y
g(x)(y)=z(x).

把题目用函数恰当的描述,描述的越好,离成功就越近,一个重要的方向是题目的描述形式的能力,当转换成简洁的函数表达时,很多干扰就消失了,变得很清晰,但是找到一个良好的表达方式是不容易的,表达方式找的好,就不容易是一团乱麻,更容易找到清晰的方法。光靠感觉,很容易乱套。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值