2017年第0届浙江工业大学之江学院程序设计竞赛决赛 M: qwb与二叉树 [记忆化dp]【动态规划】
2017-06-03 03:04
337 查看
题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=12
——————————————————————————————————————————
Problem M: qwb与二叉树
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 159 Solved: 35
[Submit][Status][Web Board]
Description
某一天,qwb正在上数据结构课。老师在讲台上面讲着二叉树,qwb在下面发着呆。
突然qwb想到一个问题:对于一棵n个无编号节点,m个叶子的有根二叉树,有多少种形态呐?你能告诉他吗?
Input
多组输入,处理到文件结束,大约有104组数据。
每一组输入一行,两个正整数n,m(0≤m≤n≤50),意义如题目所述。
Output
每一行输出一个数,表示相应询问的答案,由于答案可能很大,请将答案对109+7取模后输出。
Sample Input
4 2
10 5
Sample Output
6
252
HINT
样例1的6种形态:
![](http://115.231.222.240:8081/JudgeOnline/upload/image/20170525/20170525135945_50358.png)
——————————————————————————————————————————
心态爆炸的一道题,现场后2hours wa到死… 其实是题目描述错了1~50 但后台数据是0~50,后来修改了
题目而言是好题目,
设dp[i][j]是i个节点j个叶子的树的种类
那么转移就是以当前点为根,左右子树方案数的乘积,
dp[n][m]=∑i∑jdp[i][j]∗dp[n−1−i][m−j]
我开始采取记忆化的方式,然后处理答案要交表,然后发现时间比较快 交完就wa,补题的时候发现数据范围描述有误。。。
但其实如果我输出不是dp
[m],而直接dfs(n,m)也就诶问题了,,,也算长个记性。。。
附本题代码
——————————————————————————————————————————
——————————————————————————————————————————
Problem M: qwb与二叉树
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 159 Solved: 35
[Submit][Status][Web Board]
Description
某一天,qwb正在上数据结构课。老师在讲台上面讲着二叉树,qwb在下面发着呆。
突然qwb想到一个问题:对于一棵n个无编号节点,m个叶子的有根二叉树,有多少种形态呐?你能告诉他吗?
Input
多组输入,处理到文件结束,大约有104组数据。
每一组输入一行,两个正整数n,m(0≤m≤n≤50),意义如题目所述。
Output
每一行输出一个数,表示相应询问的答案,由于答案可能很大,请将答案对109+7取模后输出。
Sample Input
4 2
10 5
Sample Output
6
252
HINT
样例1的6种形态:
![](http://115.231.222.240:8081/JudgeOnline/upload/image/20170525/20170525135945_50358.png)
——————————————————————————————————————————
心态爆炸的一道题,现场后2hours wa到死… 其实是题目描述错了1~50 但后台数据是0~50,后来修改了
题目而言是好题目,
设dp[i][j]是i个节点j个叶子的树的种类
那么转移就是以当前点为根,左右子树方案数的乘积,
dp[n][m]=∑i∑jdp[i][j]∗dp[n−1−i][m−j]
我开始采取记忆化的方式,然后处理答案要交表,然后发现时间比较快 交完就wa,补题的时候发现数据范围描述有误。。。
但其实如果我输出不是dp
[m],而直接dfs(n,m)也就诶问题了,,,也算长个记性。。。
附本题代码
——————————————————————————————————————————
#include <bits/stdc++.h> typedef long long int LL; using namespace std; #define abs(x) (((x)>0)?(x):-(x)) const int N = 1000000+10; const int MOD = 1e9+7; /******************************************/ LL dp[555][555]; LL dfs(int x,int y){ if(dp[x][y]!=-1) return dp[x][y]; if(x<y*2-1||x<=0||y<=0) return dp[x][y]=0ll; int xx=x-1,yy=y; LL res = 0; res=(2ll*dfs(xx,yy))%MOD; for(int i=0;i<xx;i++) for(int j=1;j<yy;j++) res=(res+(1ll*dfs(i,j)*dfs(xx-i,yy-j))%MOD)%MOD; return dp[x][y]=res; } int main(){ memset(dp,-1,sizeof(dp)); dp[1][1]=1; // for(int i=1;i<=50;i++){ // printf("{"); // for(int j=1;j<50;j++) printf("%9lld,",dp[i][j]); // printf("%9lld},\n",dp[i][50]); // } int n,m; while(~scanf("%d%d",&n,&m)) { // if(n<1||n>100||m<1||m>100) while(true); printf("%lld\n",dfs(n,m)); } return 0; }
相关文章推荐
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 B: qwb与矩阵(动态规划)
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 D: qwb与神奇的序列 [矩阵]【数学】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 E: qwb和李主席 [折半枚举二分]【思维?套路!】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 Problem F: qwb has a lot of Coins (博弈论)
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 F: qwb has a lot of Coins [nim]【博弈】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 Problem E: qwb和李主席 (折半枚举!!!!n堆数分成最接近的两堆!!
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 G: qwb去面试 [找规律]【思维】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 G.qwb去面试【贪心】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 A.qwb与支教【二分+简单容斥】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒 [可持久化01字典树]【数据结构】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 Problem G: qwb去面试(数学问题)
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 J: qwb又偷懒了 [BIT]【数据结构】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 K: qwb与小数 [快速幂]【思维】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 Problem D: qwb与神奇的序列(数论+快速幂)
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 D.qwb与神奇的序列【递推】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 L: qwb与整数对 [离线]【思维】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 Problem A: qwb与支教(容斥+二分)
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 A: qwb与支教 [容斥]【数学】
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 B: qwb与矩阵
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 Problem E: qwb和李主席(折半搜索+类二分枚举)