【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树
【树形DP】三色二叉树
标签(空格分隔): 树形DP
【题目】
一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”:
0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 该树有两个子节点,S1,S2分别为两个二叉树的序列 例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示。
你的任务是要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿色或蓝色。并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。
输入格式
输入文件仅有一行,不超过10000个字符,表示一个二叉树序列
输出格式
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
样例输入
1122002010
样例输出
5 2
【思路】
(想是好想,调是真难调)
1.题目中又让输出最多又让输出最小的,一看就要开2个数组,一个存最大,一个存最小,f[u][]表示以u为根节点的最大绿节点,d[u][]表示以u为根节点的最小绿节点
2.每个节点可以是三种颜色中的一种,根据我们之前写过的小胖守皇宫和没有上司的舞会,很容易想到用三个状态分别表示三个颜色,这题我是以0做绿,1-红,2-蓝
3.建树是个头疼的问题,细细搞♂了搞题目,这个序列有一个显著特点:如果u有子节点,u+1一定是它的另一个子节点,而另一个节点却不一定是u+2(自己可以画个图,样例就是这样的),这里只能对整个树进行编号(DFS序),然后搞DFS序
4.各种转移情况看代码
【代码】
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e6+50,INF=0x3f3f3f3f;
int n,m,f[maxn][4],tot=1,d[maxn][4],b[maxn],ans=1;
char str[maxn];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;ch=getchar();
}
while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
return s*w;
}//绿 红 蓝
// 0 1 2
void DFS(int u){
if(str[u]=='0'){
f[u][0]=d[u][0]=1;
return;
}
DFS(++tot);//递归一个子节点的
if(str[u]=='1'){//只有一个节点
f[u][0]=max(f[u+1][1],f[u+1][2])+1;//u被染绿了,那它的子节点一定不是绿色
f[u][1]=max(f[u+1][0],f[u+1][2]);//u被染红了,它的子节点一定不是红色
f[u][2]=max(f[u+1][1],f[u+1][0]);//以下同理
d[u][0]=min(d[u+1][1],d[u+1][2])+1;
d[u][1]=min(d[u+1][0],d[u+1][2]);
d[u][2]=min(d[u+1][1],d[u+1][0]);
}else if(str[u]=='2'){
int k=++tot;//这里由于建树的问题,如果u有子节点,那u+1一定是它的一个子节点,另一个节点就是k
DFS(k);//还有一个节点就递归那个节点
f[u][0]=max(f[u+1][1]+f[k][2],f[k][1]+f[u+1][2])+1;//u被染绿了,那它的两个子节点一定不是绿色,取红蓝和蓝红中最大的一个
f[u][1]=max(f[u+1][0]+f[k][2],f[k][0]+f[u+1][2]);//u被染红了,那它的两个子节点一定不是红色,取绿蓝和蓝绿中最大的一个
f[u][2]=max(f[u+1][1]+f[k][0],f[k][1]+f[u+1][0]);//以下同理
d[u][0]=min(d[u+1][1]+d[k][2],d[k][1]+d[u+1][2])+1;
d[u][1]=min(d[u+1][0]+d[k][2],d[k][0]+d[u+1][2]);
d[u][2]=min(d[u+1][1]+d[k][0],d[k][1]+d[u+1][0]);
}
ans=max(ans,f[u][0]);
return;
}
int main(){
freopen("a.in","r",stdin);
cin>>str+1;
DFS(1);
cout<<ans<<" "<<min(min(d[1][1],d[1][2]),d[1][0]);
}
【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树的更多相关文章
- 洛谷P2585 [ZJOI2006]三色二叉树(树形dp)
传送门 设$dp[u][i]$表示点$u$颜色为$i$时最多(最少)的绿点个数(这里用$0$表示绿点) 然后直接用树形dp就可以了 记得把情况讨论清楚 //minamoto #include<b ...
- 洛谷P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...
- 【洛谷P2585】三色二叉树
题目大意:给定一个二叉树,可以染红绿黄三种颜色,要求父节点和子节点的颜色不同,且如果一个节点有两个子节点,那么两个子节点之间的颜色也不同.求最多和最少有多少个节点会被染成绿色. 题解:加深了对二叉树的 ...
- luogu P2585 [ZJOI2006]三色二叉树
P2585 [ZJOI2006]三色二叉树 题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO ...
- P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数, ...
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- BZOJ_1864_[Zjoi2006]三色二叉树_树形DP
BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
随机推荐
- 原生js ajax 封装
首先我们先了解ajax的get和post请求分别是怎样请求数据的 get请求 let ajx = new XMLHttpRequest() //创建ajax实例 /*打开需要请求的地址,可以有三个参数 ...
- ubuntu下Vivado launch SDK后,SDK无菜单栏解决办法
最近在调Xilinx的ZYNQ 7015,按照教程从Vivado中Launch SDK后遇到了个问题,SDK的菜单栏消失了,真的没了,我的环境是ubuntu 16.4.百度好久都没有人遇到该问题,经过 ...
- python自学Day03(自学书籍python编程从入门到实践)
第4章 操作列表 只需要几行代码无论列表有多长,循环都能够让我对列表的每个元素都采取一个或一系列相同的措施,从而高效的处理任何长度的列表. 4.1 遍历整个列表 对列表中每个元素都拿出来,进行一个或者 ...
- Spring IoC 容器的扩展
前言 本篇文章主要介绍 Spring 中 BeanFactory 的扩展 ApplicationContext,我们平时日常开发中也基本上是使用它,不会去直接使用 BeanFactory. 那么在 S ...
- 如何在Linux上安装Redis(内附详细教程)
前言 hello,好久不见,又断更了一段时间.同事大部分离职了,但是活还是一样,所以只能硬着头皮顶上.现在总算歇会了,决定开启Redis源码系列,希望不要啪啪啪打脸. 什么是redis? Redi ...
- web开发网络请求到数据的整合办法
开发中向服务器请求到的数据是特别复杂的,需要从中抽离出需要展示的数据进行展示个和交互. 思路: 先将请求到的复杂数据传递到一个类A中,从类A里抽离出需要的数据.需要展示数据的地方,面向类A开发,类A关 ...
- 01.Markdown学习
Markdown学习 一.标题 在想要设置为标题的文字前面加#来表示(#后面有空格) 一个#是一级标题,二个#是二级标题,以此类推.支持六级标题. 示例: # 这是一级标题 ## 这是二级标题 ### ...
- Source Insight 中的 Auto Indenting
编码过程中,希望输入花括号时能自动对齐,Source Insigth 应如何设置? 先来看一下Source Insight 中的帮助. “ Auto Indenting The auto-indent ...
- Apache(httpd)详解
httpd详解(思维导图) 1. httpd服务 ASF 服务器类型 http服务器 应用程序服务器 httpd的特性 高度模块化 DSO机制 MPM httpd的并发响应模型 prefork wor ...
- 其他函数-web_concurrent
web_concurrent_start函数是并发组开始的标记.组中所有的函数是并发执行的,并发组的结束符为web_concurrent_end 函数. 在并发组中,可以包含的函数有: web_url ...