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,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...
随机推荐
- WIndows系统BAT文件语法和技巧 原文的地址(http://www.jb51.net/article/5828.htm)
批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本 ...
- postman中传参说明
1.form-data 表单传递,对应multipart/form-data, 2.x-www-form-urlencoded 默认传递,对应application/x-www-from-urlenc ...
- luogu题解 P4092 【[HEOI2016/TJOI2016]树】树链剖分
题目链接: https://www.luogu.org/problemnew/show/P4092 瞎扯--\(O(Q \log^3 N)\)解法 这道先yy出了一个\(O(Q \log^3 N)\) ...
- 关于小程序去除view/navigator 点击后默认阴影效果
hover:class :定义容器在被触发时的样式 通常无用,但若不去除则影响用户体验: 为避免被覆盖,约定在wxss底部添加class,比如: <!-- wxml --> <na ...
- 原生js实现选项卡样式切换的几种方式。
先分享一个不能实现的实例(因为es5没有块作用域) for(var i=0; i<list.length; i++ ) { list[i].onclick = function(){ tabch ...
- 如何检测浏览器是否能用ActiveX
var xhr=false; function CreateXHR(){ try{ //检查能否用activexobject xhr=new ActiveXObject("msxml2.XM ...
- oracle wm_concat函数用法
在Oracle中使用wm_concat(column)可以实现字段的分组合并,逗号分隔.
- FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换
当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...
- bash shell脚本之成员变量
shell中变量的使用 cat test3: #!/bin/bash # testing variables days= guest="Katie" echo "$gue ...
- 如何远程调试部署在CloudFoundry平台上的nodejs应用
网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等. 在实际情况中,我们可能遇到本地运行良好 ...