UVA 10312 - Expression Bracketing(数论+Catalan数)
来源:互联网 发布:cf抽奖算法 编辑:程序博客网 时间:2024/05/28 17:08
题目链接: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;}
1 0
- UVA 10312 - Expression Bracketing(数论+Catalan数)
- uva 10312 - Expression Bracketing(Catalan+SuperCatalan)
- UVA - 10312 Expression Bracketing
- UVa 10312 - Expression Bracketing
- Uva 10312 - Expression Bracketing 解题报告(卡特兰数+递推)
- UVa10312 - Expression Bracketing(Catalan和super catalan)
- uva 10312——Expression Bracketing
- UVA10312- Expression Bracketing(Catalan + 递推)
- 基础数论算法(⑩) Catalan数与Stirling数
- 算法基础篇(数论):Catalan数计算及应用
- uva10312 - Expression Bracketing 括号划分
- 卡特兰数(Catalan UVa 991 10303 10007 1478)
- catalan数(poj1095)
- HDU1023(Catalan数)
- Catalan数(一)
- Catalan数(二)
- Catalan数(卡塔兰数)
- Catalan数(高精版)
- 忘记 Linux虚拟机的密码
- 进程和线程
- CSS样式导入的三个方法
- 堆和栈的区别(转过无数次的文章)
- Ugly Numbers
- UVA 10312 - Expression Bracketing(数论+Catalan数)
- Linux find命令详解和实例说明
- contextlib——上下文管理
- 【JavaWeb】基础知识总结05 jQuery
- POJ 1003
- C# 创建自定义转换
- UVA 10497 - Sweet Child Makes Trouble(DP+高精度)
- 飞鸽传书文件记录选择CFile还是CStdioFile?
- 对.Net系统架构改造的一点经验和教训