题目链接:

option=com_onlinejudge&Itemid=8&page=show_problem&problem=1253">10312 - Expression Bracketing

题意:有n个x,要求分括号,推断非二叉表达式的个数。
思路:二叉表达式的计算方法就等于是Catalan数的,那么仅仅要计算出总数,用总数减去二叉表达式个数。得到的就是非二叉表达式的个数。

那么计算方法是什么呢。

看题目中的图,对于n = 4的情况,能够分为这几种情况来讨论:
四个1。 一个2两个1,一个3一个1。一个4。相应的情况数为1。3。 2。 1。
答案为f(1)^4 + 3 * f(2) * f(1)^2 + f(3) * f(1) + f(4)。
一种做法是把n去分解然后计算。可是显然这是不可行的,n最大为26,情况数太多了。
然后找题解,发现这个竟然有公式,这个式子叫SuperCatalan数。

然后也有递推出来的解。设dp[n][2]。n表示还有n个子节点未分配。2表示0为最多分配n - 1个点,1为最多分配n个点,这样能保证子树都至少有两个节点。这样就是总情况了,直接用记忆化搜下去就可以

代码:

公式解:

#include <stdio.h>
#include <string.h> int n;
long long Catalan[30], SuperCatalan[30]; int main() {
Catalan[1] = Catalan[2] = 1;
for (int i = 3; i <= 26; i++) {
Catalan[i] = Catalan[i - 1] * (4 * i - 6) / i;
}
SuperCatalan[1] = SuperCatalan[2] = 1;
for (int i = 3; i <= 26; i++) {
SuperCatalan[i] = (3 * (2 * i - 3) * SuperCatalan[i - 1] - (i - 3) * SuperCatalan[i - 2]) / i;
}
while (~scanf("%d", &n)) {
printf("%lld\n", SuperCatalan[n] - Catalan[n]);
}
return 0;
}

递推解:

#include <stdio.h>
#include <string.h> int n;
long long Catalan[30], dp[30][2]; long long dfs(int n, int flag) {
long long &ans = dp[n][flag];
if (~ans) return ans;
if (n <= 1) return ans = 1;
ans = 0;
for (int i = 1; i < n + flag; i++)
ans += dfs(i, 0) * dfs(n - i, 1);
return ans;
} int main() {
Catalan[1] = Catalan[2] = 1;
for (int i = 3; i <= 26; i++) {
Catalan[i] = Catalan[i - 1] * (4 * i - 6) / i;
}
while (~scanf("%d", &n)) {
memset(dp, -1, sizeof(dp));
printf("%lld\n", dfs(n, 0) - Catalan[n]);
}
return 0;
}

UVA 10312 - Expression Bracketing(数论+Catalan数)的更多相关文章

  1. UVA - 10312 Expression Bracketing

    Description Problem A Expression Bracketing Input: standard input Output: standard output Time Limit ...

  2. 【bzoj1856】[Scoi2010]字符串 Catalan数

    题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...

  3. 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

    Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...

  4. 卡特兰数 Catalan数 ( ACM 数论 组合 )

    卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1)  编辑 收藏 引用 所属分类: ACM ( 数论 ...

  5. Catalan数(数论)

    Catalan数 [参考网址]http://www.cnblogs.com/gongxijun/p/3232682.html 记得当时我们队写过一个,差点超时,现在找到了公式,感觉还是挺简单的. 还要 ...

  6. ACM数论-卡特兰数Catalan

    Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...

  7. hdu 1130 How Many Trees?(Catalan数)

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. [Catalan数]1086 栈、3112 二叉树计数、3134 Circle

    1086 栈 2003年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 栈是计算机中 ...

  9. Catalan数应用整理

    应用一: codevs 3112 二叉树计数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 一个有n个结点的二叉树总共有 ...

随机推荐

  1. 拔一拔 ExtJS 3.4 里你遇到的没遇到的 BUG(1)

    本文从今天开始,我要做的就是不断的更新,不断的披露ExtJS 3.4的BUG并修复它.需要注意的是版本为3.4而不是4.0,因为4.0改动和变化比较大,所以不要对号入座. 嘿嘿,本人不怎么写东西,不过 ...

  2. 页面打开直接执行a点击事件

    <script> window.onload = function(){ function autoclick(){ var url = document.getElementById(' ...

  3. 一周学会Mootools 1.4中文教程:(4)类型

    Mootools的类型主要包含下边几部分:String:字符串;Number:数字;Array:数组;Object:对象;Json:;Cookie:. 这也是我们今天的讲述重点.每一种数据类型Mt都为 ...

  4. Python中初始化的问题以及注释问题

    #coding=utf-8 # __author__ = 'minmin' from Tkinter import * #创建一个基于Frame的Application类 class Applicat ...

  5. font简写语法

    font简写语法 测试 <p class="p box">这是子元素的字体 默认继承了哪些字体属性 **font-style font-weight font-size ...

  6. 工具类_java 操作cookie

    import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;im ...

  7. Android UI--ViewPager扩展Tab标签指示

    Android UI--ViewPager扩展Tab标签指示 2013年8月30日出来冒冒泡 ViewPager这个控件已经不算是陌生的了,各种玩Android的小伙伴们都有发表相应的文章来讲它.我看 ...

  8. mongoose查询特定时间段文档的方法

    db.collection.find({ time:{ "$gte": new Date('2014-01-24'), "$lte":new Date('201 ...

  9. getline函数

    在我的印象中,getline函数常常出如今自己的视野里,模糊地记得它常常常使用来读取字符串 .可是又对它的參数不是非常了解,今天又用到了getline函数,如今来细细地总结一下: 首先要明确设计get ...

  10. python闭包以及装饰器

    通俗的定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变 ...