luogu P2585 [ZJOI2006]三色二叉树
P2585 [ZJOI2006]三色二叉树
题目描述

输入输出格式
输入格式:
输入文件名:TRO.IN
输入文件仅有一行,不超过10000个字符,表示一个二叉树序列。
输出格式:
输出文件名:TRO.OUT
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
输入输出样例
1122002010
5 2
思路:
我们只关心绿色节点的数目,而红色蓝色可以看作无色,
但是对于一个根节点和它的两个儿子,必须有一个绿色节点
按照树形DP的思路,我们开一个二维数组dp[Maxn][2]
一二维分别保存:
该树的最优数目,该根节点涂绿色与不涂绿色[1表示涂绿色,0表示不涂]
以最大绿色数为例:
dp[i][0]=max(dp[left[i]][1]+dp[right[i]][0],dp[left[i]][0]+dp[right[i]][1]);
如果不涂i节点, 那么i节点的子节点一定要有一个涂, 所以要么左为1右为0, 要么左为0右为1
即:
dp[i][1]=dp[left[i]][0]+dp[right[i]][0]+1
如果涂i节点,那么它的两个儿子当然都不能涂! [别忘了还需要加上1,即:统计上i节点的绿色]
最小绿色也是一个道理,只要把max改为min即可:
dp[i][0]=min(dp[left[i]][1]+dp[right[i]][0],dp[left[i]][0]+dp[right[i]][1]);
坑点:
数据范围是个大坑....应该开到10万才可以,他少打了个0....
上代码:
/*
Max
dp[i][1]=dp[left[i]][0]+dp[right[i]][0]+1
Min
dp[i][0]=min(dp[left[i]][1]+dp[right[i]][0],dp[left[i]][0]+dp[right[i]][1]);
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std; const int Maxn = ;
const int Colors = ;
int rt,top=;
int L[Maxn],R[Maxn];
///第一维表示第几个点,第二维表示染什么颜色
int dpMax[Maxn][Colors],dpMin[Maxn][Colors]; int Max(int a, int b)
{return a > b ? a : b;}
int Min(int a, int b)
{return a < b ? a : b;} int build() {
top++;
int num=top;
int son=getchar()-'';
///默认为son==0时没有孩子,son==1时只有左孩子,son==2时左右均有.
if(son==) {
L[num]=;
R[num]=;
}
else if(son==) {
L[num]=build();
R[num]=;
}
else {
L[num]=build();
R[num]=build();
}
///返回孩子编号
return num;
}
///找较大值
void findMax(int u) {
if(dpMax[L[u]][]==-)
findMax(L[u]);
if(dpMax[R[u]][]==-)
findMax(R[u]);
dpMax[u][]=Max(dpMax[L[u]][]+dpMax[R[u]][],dpMax[L[u]][]+dpMax[R[u]][]);
dpMax[u][]=dpMax[L[u]][]+dpMax[R[u]][]+;
}
///找较小值
void findMin(int u) {
if(dpMin[L[u]][]==-)
findMin(L[u]);
if(dpMin[R[u]][]==-)
findMin(R[u]);
dpMin[u][]=Min(dpMin[L[u]][]+dpMin[R[u]][],dpMin[L[u]][]+dpMin[R[u]][]);
dpMin[u][]=dpMin[L[u]][]+dpMin[R[u]][]+;
} int main() {
rt=build();
memset(dpMax,-,sizeof(dpMax));
memset(dpMin,-,sizeof(dpMin));
///空节点为0,便于更新
dpMax[][]=dpMax[][]=;
dpMin[][]=dpMin[][]=;
findMax(rt);
findMin(rt);
int a1=Max(dpMax[rt][],dpMax[rt][]),
a2=Min(dpMin[rt][],dpMin[rt][]);
printf("%d %d",a1,a2);
return ;
}
luogu P2585 [ZJOI2006]三色二叉树的更多相关文章
- 【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树
[树形DP]三色二叉树 标签(空格分隔): 树形DP [题目] 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1 ...
- P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数, ...
- 洛谷P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...
- 洛谷P2585 [ZJOI2006]三色二叉树(树形dp)
传送门 设$dp[u][i]$表示点$u$颜色为$i$时最多(最少)的绿点个数(这里用$0$表示绿点) 然后直接用树形dp就可以了 记得把情况讨论清楚 //minamoto #include<b ...
- [ZJOI2006]三色二叉树
[ZJOI2006]三色二叉树 BZOJ luogu 分3种颜色讨论转移一下 #include<bits/stdc++.h> using namespace std; const int ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )
难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...
- BZOJ_1864_[Zjoi2006]三色二叉树_树形DP
BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...
随机推荐
- PHP max_input_var设为了1000导致post数组太多时无法接受后面的参数值
PHP max_input_var设为了1000导致post数组太多时无法接受后面的参数值 下午突然接到格力电话说无法批量设置门店任务,但是在测试环境下无法重现,测试环境下好好的. 然后登陆到生产环境 ...
- 关于FSM的C语言实现与详解
最近一个项目有一个需求,考量了一下决定使用状态机,实现完需求以后,不得不感慨,状态机在处理逻辑上面实现起来很有优势,也便于管理. 在这里分享一下我所修改的状态机实现.改动的地方不多,参考了<C语 ...
- python 修改、读取图片元数据
图片元数据 图片元数据(metadata)是嵌入到图片文件中的一些标签.比较像文件属性,但是种类繁多.常见的几种标准有: EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号.镜头.曝光.图片尺 ...
- NSInvocation简单总结
(1)用法 NSInvocation是调用函数的另一种方式,它将调用者,函数名,参数封装到一个对象,然后通过一个invoke函数来执行被调用的函数,其思想就是命令者模式,将请求封装成对象. 例如,有这 ...
- mysql tinyint(1) 在java中被转化为boolean
数据库表字段类型为:tinyint 长度为1 在java中对应的类型是boolean 查询时直接在页面展示成true或false 如果是2,3,4 这样的也是默认成true,非常不友好. 解决方案: ...
- Flutter——Padding组件
在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属性.这个时候我们可以用 Padding 组件处理容器与子元素直接的间距. ...
- Oralce问题之ORA-12560:TNS协议适配器错误
在Windows系统中,通过CMD命令打开命令窗口,通过命令:sqlplus / as sysdba回车后提示 协议适配器错误 可能原因: (1).Oralce数据库监听服务没启动起来 通过开始-&g ...
- 使用php实现javascript的escape和unescape函数
javascript有编码函数escape()和对应的解码函数unescape(),而php中只有个urlencode和urldecode,这个编码和解码函数对encodeURI和encodeURIC ...
- iOS 中通过kvc 获取数组的均值、求和、最大最小值等
NSArray *values = @[@, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @]; NSNumber *avg = [values valu ...
- Prim算法和Kruskal算法介绍
一.Prim算法 普利姆(Prim)算法适用于求解无向图中的最小生成树(Minimum Cost Spanning Tree).下面是Prim算法构造最小生成树的过程图解. ...