BZOJ_1864_[Zjoi2006]三色二叉树_树形DP
BZOJ_1864_[Zjoi2006]三色二叉树_树形DP
题意:

分析:递归建树,然后DP,从子节点转移。
注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的。这样的话我们只需要知道当前节点是否为绿色即可。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 500050
int lson[N],rson[N],cnt,n;
int f[N][2],g[N][2],h[N][2];
void build(int x)
{
char s=getchar();
if(s=='0')return ;
lson[x]=++cnt;build(lson[x]);
if(s=='2')
{
rson[x]=++cnt;build(rson[x]);
}
}
void dfs(int x)
{
int u=lson[x],v=rson[x];
if(u==0&&v==0)
{
f[x][0]=f[x][1]=1;
return ;
}
dfs(u);
if(v)
{
dfs(v);
f[x][0]=max(g[u][0]+h[v][0],g[v][0]+h[u][0])+1;
g[x][0]=max(f[u][0]+h[v][0],f[v][0]+h[u][0]);
h[x][0]=max(f[u][0]+g[v][0],f[v][0]+g[u][0]);
f[x][1]=min(g[u][1]+h[v][1],g[v][1]+h[u][1])+1;
g[x][1]=min(f[u][1]+h[v][1],f[v][1]+h[u][1]);
h[x][1]=min(f[u][1]+g[v][1],f[v][1]+g[u][1]);
}
else
{
f[x][0]=max(g[u][0],h[u][0])+1;
h[x][0]=max(f[u][0],g[u][0]);
g[x][0]=max(f[u][0],h[u][0]);
f[x][1]=min(g[u][1],h[u][1])+1;
h[x][1]=min(f[u][1],g[u][1]);
g[x][1]=min(f[u][1],h[u][1]);
}
}
int main()
{
cnt=1;
build(1);
dfs(1);
printf("%d %d",max(max(f[1][0],g[1][0]),h[1][0]),min(min(f[1][1],g[1][1]),h[1][1]));
}
BZOJ_1864_[Zjoi2006]三色二叉树_树形DP的更多相关文章
- 三色二叉树_树形DP
Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序 ...
- 洛谷P2585 [ZJOI2006]三色二叉树(树形dp)
传送门 设$dp[u][i]$表示点$u$颜色为$i$时最多(最少)的绿点个数(这里用$0$表示绿点) 然后直接用树形dp就可以了 记得把情况讨论清楚 //minamoto #include<b ...
- 1864. [ZJOI2006]三色二叉树【树形DP】
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...
- BZOJ 1864:[Zjoi2006]三色二叉树(树DP)
三色二叉树 问题描述 输入 仅有一行,不超过500000个字符,表示一个二叉树序列. 输出 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 样例输入 1122002010 ...
- 三色二叉树 ---伪树形dp
题目描述 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 ...
- BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
- BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )
难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...
随机推荐
- html5中的网页结构
一.html5中的大纲 在html5中,使用各种结构元素所描述出来的整个网页的层次结构,就是该网页的大纲.因此在组织这份大纲的时候,不能使用div元素,因为div元素只能当做容器,用在需要对网页中某个 ...
- reorder list(链表重新排序)
Given a singly linked list L: L0→L1→-→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do thi ...
- ImageMagick
http://blog.csdn.net/lan861698789/article/details/7738383 1.官网 http://www.imagemagick.org/script/ind ...
- 如何使你的Ajax应用内容可让搜索引擎爬行
This document outlines the steps that are necessary in order to make your AJAX application crawlable ...
- jdk的配置
在新建页面系统变量,输入变量名"JAVA_HOME":变量值"你的jdk的路径 在系统变量区域,选择"新建",输入变量名"CLASSPATH ...
- .net 弹出消息框后,页面样式变乱
点击按钮,执行提交操作,弹出消息框后,页面的样式变乱,解决方法: 首先,确定使用的css样式正确,页面中的宽高值保持规范统一: 然后,弹出框避免使用Response.Write(),如下所示 Resp ...
- 获取linux帮助命令
命令的分类 linux的命令分为内部命令和外部命令. 内部命令指的是shell程序自带的命令,是shell程序的一部分,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系 ...
- 2018山东省ACM省赛G题-Game
Alice and Bob are playing a stone game. There are n piles of stones. In each turn, a player can remo ...
- python!!!!惊了,这世上居然还有这么神奇的东西存在
第一次接触到python的时候实在看学习3Blue1Brown的视频线性代数的本质的时候.惊奇的是里面的视频操作,例如向量的变化,线性变换等都是由python用代码打出来的.那时的我只是以为pytho ...
- 由清除float原理到BFC
关于浮动 设置为浮动的元素会脱离当前文档流,向左或向右移动直到边缘遇到另一个浮动元素或者到达边界.普通元素不会对齐造成影响. 浮动是把双刃剑,在给我们的布局带来便利的同时有一些缺点需要我们去解决.例如 ...