[2017浙工大之江学院决赛 M] qwb与二叉树(记忆化搜索,卡特兰数)
Posted tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2017浙工大之江学院决赛 M] qwb与二叉树(记忆化搜索,卡特兰数)相关的知识,希望对你有一定的参考价值。
题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=12
题意:中文题面。
假如不限定叶子数的话,问题就是求二叉树形态数,可以每次枚举节点数,以后来的节点为根,左右子树的形态数做乘法原理得到,就是卡特兰数。
这里多限定了叶子数,其实没有什么区别,在枚举的时候,左右子树再分别统计一下不同叶子数的情况就行。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long long LL; 5 const LL mod = 1e9+7; 6 const int maxn = 55; 7 LL dp[maxn][maxn]; 8 LL n, m; 9 10 LL dfs(int x, int y) { 11 if(y > x) return 0; 12 if(~dp[x][y]) return dp[x][y]; 13 LL ret = 0; 14 for(int i = 0; i < x; i++) { 15 for(int j = 0; j <= y; j++) { 16 ret = (ret + (dfs(i, j) * dfs(x-i-1, y-j)) % mod) % mod; 17 } 18 } 19 return dp[x][y] = ret; 20 } 21 22 int main() { 23 // freopen("in", "r", stdin); 24 memset(dp, -1, sizeof(dp)); 25 dp[0][0] = 1; dp[1][0] = 0; dp[1][1] = 1; 26 while(~scanf("%lld%lld",&n,&m)) { 27 printf("%lld\n", dfs(n, m)); 28 } 29 return 0; 30 }
以上是关于[2017浙工大之江学院决赛 M] qwb与二叉树(记忆化搜索,卡特兰数)的主要内容,如果未能解决你的问题,请参考以下文章
[2017浙工大之江学院决赛 E] qwb和李主席(折半枚举,二分)
2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)
[2017年第0届浙江工业大学之江学院程序设计竞赛决赛 I] qwb VS 去污棒(并查集,按秩合并,最小生成树,LCA)