ACM学习历程—51NOD 1412 AVL树的种类(递推)
2016-05-24 16:10
399 查看
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1770
这是这次BSG白山极客挑战赛的B题。设p(i, j)表示节点个数为i,高度为j的AVL树的个数。
那么,对于1 <= k <= i-1
p[i][j] += p[k][j-1]*p[i-1-k][j-1]%MOD;
p[i][j] += p[k][j-2]*p[i-1-k][j-1]%MOD;
p[i][j] += p[k][j-1]*p[i-1-k][j-2]%MOD;
但是这样模拟是n^3的复杂度。显然是不行的。但是j和k的范围是会被i约束的。于是我优化了j那一层,本地就能跑得很快了。设置了一个from和to表示j这一维跑的范围,那么每次这一次j的最小值就是下一次from,这一次j的最大值就是下一次的to。如此即可。
代码:
View Code
这是这次BSG白山极客挑战赛的B题。设p(i, j)表示节点个数为i,高度为j的AVL树的个数。
那么,对于1 <= k <= i-1
p[i][j] += p[k][j-1]*p[i-1-k][j-1]%MOD;
p[i][j] += p[k][j-2]*p[i-1-k][j-1]%MOD;
p[i][j] += p[k][j-1]*p[i-1-k][j-2]%MOD;
但是这样模拟是n^3的复杂度。显然是不行的。但是j和k的范围是会被i约束的。于是我优化了j那一层,本地就能跑得很快了。设置了一个from和to表示j这一维跑的范围,那么每次这一次j的最小值就是下一次from,这一次j的最大值就是下一次的to。如此即可。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <vector> #include <string> #define LL long long #define MOD 1000000007 using namespace std; const int maxN = 2002; LL p[maxN][maxN]; void init() { int from, to, tfrom, tto; memset(p, 0, sizeof(p)); p[0][0] = 1; p[1][1] = 1; from = 0; to = 1; for (int i = 2; i < maxN; ++i) { tfrom = to; tto = from; to++; for (int j = from; j <= to; ++j) { for (int k = 0; k < i; ++k) { p[i][j] += p[k][j-1]*p[i-1-k][j-1]%MOD; if (j > 1) { p[i][j] += p[k][j-2]*p[i-1-k][j-1]%MOD; p[i][j] += p[k][j-1]*p[i-1-k][j-2]%MOD; } p[i][j] %= MOD; if (p[i][j]) { tfrom = min(tfrom, j); tto = max(tto, j); } } } from = tfrom; to = tto; } //cout << "OK"<<endl; } int main() { //freopen("test.in", "r", stdin); init(); int n; while (scanf("%d", &n) != EOF) { int ans; LL t = 0; for (int i = 1; i <= n; ++i) t = (t+p [i])%MOD; ans = t; printf("%d\n", ans); } return 0; }
View Code
相关文章推荐
- ECHO.js 纯javascript轻量级延迟加载的实例代码
- 传感器
- Android Studio导入aar文件的方法
- mysql事务隔离级别
- html 5 本地数据库(Web Sql Database)核心方法openDatabase、transaction、executeSql 详解
- 大型网站架构系列:消息队列(二)
- ios_极光推送(2016.5.24)
- Gesture手势及手势库
- java网络-Socket
- Linux系统脚本分析之rc.sysinit
- 面试题1:赋值运算符函数
- Redis 有序集合(sorted set)
- H3C V7命令下 IRF典型配置案列 (LACP MAD检测方式)
- 两颗星星实现的星星点击评分效果实例页面
- iOS_远程推送(官方)
- C语言:算术运算符与算术表达式
- CSDN 编辑文章
- Eclipse 批量转换文件编码
- Android universal-image-loader详细解析
- html模板引擎jade的使用