BZOJ-3227 红黑树(tree) 树形DP
个人认为比较好的(高端)树形DP,也有可能是人傻
3227: [Sdoi2008]红黑树(tree)
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 158 Solved: 96
[Submit][Status][Discuss]
Description
红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色。若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点。并规定所有前端结点的高度为-1。
一棵红黑树是满足下面“红黑性质”的染色二叉搜索树:
(1) 每个结点被染成红色或黑色;
(2) 每个前端结点为黑色结点;
(3) 任一红结点的子结点均为黑结点;
(4) 在从任一结点到其子孙前端结点的所有路径上具有相同的黑结点数。
从红黑树中任一结点x出发(不包括结点x),到达一个前端结点的任意一条路径上的黑结点个数称为结点x的黑高度,记作bh(x)。红黑树的黑高度定义为其根结点的黑高度。
给定正整数N,试设计一个算法,计算出在所有含有N个结点的红黑树中,红色内结点个数的最小值和最大值。
Input
输入共一个数N。
Output
输出共两行。
第一行为红色内结点个数的最小值,第二行为最大值。
Sample Input
8
Sample Output
1
4
HINT
对于 100% 的数据,1≤N≤5000
Source
这道题啊,想了很久,也调了挺长时间的;
中间请求Claris的帮助,可是Claris说太久没看这道了,记不太清细节了,于是我要了他的代码。。。
Claris早期的代码风格不认直视啊我的天!
题解:
令f【i】【j】【0,1】表示 包含i个非前端节点的节点,黑高度为j的,红根/黑根 红黑树中的最小/最大红节点数。
于是得到转移:
f[i][j][0]=min/max(f[i][j][0],f[k][j-1][1]+f[i-k-1][j-1][1]+1);
f[i][j][1]=min/max(f[i][j][1],min/max(f[k][j-1][1]+f[i-k-1][j-1][1],min/max(f[k][j][0]+f[i-k-1][j][0],f[k][j][0]+f[i-k-1][j-1][1])));
然后做好初始化即可;
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
#define maxn 6020
int n;
int f[maxn][32][2];
int maxans,minans;
int main()
{
n=read();
maxans=-0x7fffffff;minans=0x7fffffff;
memset(f,0x3f,sizeof f);
f[1][1][0]=1;f[1][1][1]=0;f[2][1][1]=1;
for (int i=1; i<=n; i++)
for (int j=1; j<=i; j++)
if (1<<j > n<<2) break; else
for (int k=0; k<=i-2; k++)
{
f[i][j][0]=min(f[i][j][0],f[k][j-1][1]+f[i-k-1][j-1][1]+1);
f[i][j][1]=min(f[i][j][1],min(f[k][j-1][1]+f[i-k-1][j-1][1],
min(f[k][j][0]+f[i-k-1][j][0],f[k][j][0]+f[i-k-1][j-1][1])));
}
for (int i=0; i<=30; i++)
minans=min(min(minans,f[n][i][0]),f[n][i][1]);
printf("%d\n",minans);
memset(f,-0x3f,sizeof f);
f[1][1][0]=1;f[1][1][1]=0;f[2][1][1]=1;
for (int i=1; i<=n; i++)
for (int j=1; j<=i; j++)
if (1<<j > n<<2) break; else
for (int k=0; k<=i-2; k++)
{
f[i][j][0]=max(f[i][j][0],f[k][j-1][1]+f[i-k-1][j-1][1]+1);
f[i][j][1]=max(f[i][j][1],max(f[k][j-1][1]+f[i-k-1][j-1][1],
max(f[k][j][0]+f[i-k-1][j][0],f[k][j][0]+f[i-k-1][j-1][1])));
}
for (int i=0; i<=30; i++)
maxans=max(max(maxans,f[n][i][0]),f[n][i][1]);
printf("%d\n",maxans);
return 0;
}
BZOJ-3227 红黑树(tree) 树形DP的更多相关文章
- BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...
- BZOJ 3227: [Sdoi2008]红黑树(tree)
BZOJ 3227: [Sdoi2008]红黑树(tree) 标签(空格分隔): OI-BZOJ OI-其它 Time Limit: 10 Sec Memory Limit: 128 MB Descr ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- 熟练剖分(tree) 树形DP
熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...
- [BZOJ 3227] [SDOI 2008] 红黑树(tree)
Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色.若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点.并规定所有前端结点的高度为- ...
- Bzoj3227 [Sdoi2008]红黑树(tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 204 Solved: 125 Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染 ...
- hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)
题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: ...
- CF 461B Appleman and Tree 树形DP
Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...
- codeforces 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
随机推荐
- ehcache 一二事 - ssm 中ehcashe的简单配置应用
Ehcache是一个开源Java分布式缓存.可以配合mybatis来使用 首先,在资源文件夹中新建ehcache.xml 内容如下: <?xml version="1.0&qu ...
- 2D Skeletal Animation Ready
骨骼动画 Cool 昨天研究了一天的2D骨骼动画,自己动手做了骨骼动画,感觉比用序列帧做动画方便多了,非常Cool ! 刚开始做骨骼动画用的是一整张图,做动画时在分配完权重之后,拉伸顶点上连接着的其它 ...
- TestLink学习七:TestLink测试用例Excel转换XML工具
TestLink对于测试用例的管理来说,是蛮强大的,但是在导入导出这块,功能有点弱,本文针对测试用例的导入,转载了一个Excel转换成xml工具. 1.根据到处的测试用例xml,定义一下我的Excel ...
- maven总结1
环境:win7 maven版本:apache-maven-3.1.1-bin.zip maven安装 1.确定已经正确安装jdk,若未安装需要先安装jdk 2.http://maven.apac ...
- $watch方法
监听一个model(表单),当一个model每次改变时,都会触发第二个参数函数 $scope.$watch('name',function(){});//name是model名<input ty ...
- ES6严格模式use strict下的保留字
implements interface let package private protected public static yield
- Socket Programming in C#--Introduction
This is the second part of the previous article about the socket programming. In the earlier article ...
- vrrp两用
早上想了想vrrp的使用,1,网关冗余 2,服务器热备 思想稍微有点不一样.主要在于监控口 服务器的话有心跳线,用户同步一些配置和迁移一些服务.达到热备的目的.:牵涉到四个优先级:建议这样排序: 主机 ...
- 安装Ubuntu 16.04后要做的事
Ubuntu 16.04发布了,带来了很多新特性,同样也依然带着很多不习惯的东西,所以装完系统后还要进行一系列的优化. 1.删除libreoffice libreoffice虽然是开源的,但是Java ...
- LeetCode 笔记27 Two Sum III - Data structure design
Design and implement a TwoSum class. It should support the following operations: add and find. add - ...