博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 10312 - Expression Bracketing(数论+Catalan数)
阅读量:7194 次
发布时间:2019-06-29

本文共 1435 字,大约阅读时间需要 4 分钟。

题目链接:

题意:有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 
#include
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 
#include
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;}

转载地址:http://lytkm.baihongyu.com/

你可能感兴趣的文章
阿里云挂载数据盘
查看>>
使用selenium模拟浏览器抓取淘宝商品美食信息
查看>>
MongoDB服务无法启动,windows提示发生服务特定错误:100
查看>>
A Simple OpenGL Shader Example
查看>>
资料整理面试
查看>>
理解JavaScript中的事件处理
查看>>
lock: mutex/spinlock/shared lock
查看>>
基于JAVA的身份证实名认证接口调用代码实例
查看>>
Shell命令-文件压缩解压缩之tar、unzip
查看>>
挺有意思的一段VBS代码,让系统阅读/朗读指定文本
查看>>
mysql体系结构
查看>>
CSS实现图片半透明代码
查看>>
hdu 4135 Co-prime (素数打表+容斥原理)
查看>>
manacher算法求最长回文子串
查看>>
(转)IDataGridViewEditingControl 接口 作用
查看>>
ie兼容性问题的一些总结,待添加。后续有图
查看>>
获取客户端IP
查看>>
【论文阅读】StainGAN: Stain Style Transfer for Digital Histological Images
查看>>
细节性的错误
查看>>
c++中string的用法
查看>>