P2585 [ZJOI2006]三色二叉树

题目描述

输入输出格式

输入格式:

输入文件名:TRO.IN

输入文件仅有一行,不超过10000个字符,表示一个二叉树序列。

输出格式:

输出文件名:TRO.OUT

输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。

输入输出样例

输入样例#1:

1122002010
输出样例#1:

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]三色二叉树的更多相关文章

  1. 【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树

    [树形DP]三色二叉树 标签(空格分隔): 树形DP [题目] 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1 ...

  2. P2585 [ZJOI2006]三色二叉树

    题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数, ...

  3. 洛谷P2585 [ZJOI2006]三色二叉树

    题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...

  4. 洛谷P2585 [ZJOI2006]三色二叉树(树形dp)

    传送门 设$dp[u][i]$表示点$u$颜色为$i$时最多(最少)的绿点个数(这里用$0$表示绿点) 然后直接用树形dp就可以了 记得把情况讨论清楚 //minamoto #include<b ...

  5. [ZJOI2006]三色二叉树

    [ZJOI2006]三色二叉树 BZOJ luogu 分3种颜色讨论转移一下 #include<bits/stdc++.h> using namespace std; const int ...

  6. BZOJ1864[ZJOI2006]三色二叉树[树形DP]

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 773  Solved: 548[Submit][Status] ...

  7. 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP

    1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...

  8. BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )

    难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...

  9. BZOJ_1864_[Zjoi2006]三色二叉树_树形DP

    BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...

随机推荐

  1. WIndows系统BAT文件语法和技巧 原文的地址(http://www.jb51.net/article/5828.htm)

    批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本 ...

  2. postman中传参说明

    1.form-data 表单传递,对应multipart/form-data, 2.x-www-form-urlencoded 默认传递,对应application/x-www-from-urlenc ...

  3. luogu题解 P4092 【[HEOI2016/TJOI2016]树】树链剖分

    题目链接: https://www.luogu.org/problemnew/show/P4092 瞎扯--\(O(Q \log^3 N)\)解法 这道先yy出了一个\(O(Q \log^3 N)\) ...

  4. 关于小程序去除view/navigator 点击后默认阴影效果

    hover:class  :定义容器在被触发时的样式 通常无用,但若不去除则影响用户体验: 为避免被覆盖,约定在wxss底部添加class,比如: <!-- wxml --> <na ...

  5. 原生js实现选项卡样式切换的几种方式。

    先分享一个不能实现的实例(因为es5没有块作用域) for(var i=0; i<list.length; i++ ) { list[i].onclick = function(){ tabch ...

  6. 如何检测浏览器是否能用ActiveX

    var xhr=false; function CreateXHR(){ try{ //检查能否用activexobject xhr=new ActiveXObject("msxml2.XM ...

  7. oracle wm_concat函数用法

    在Oracle中使用wm_concat(column)可以实现字段的分组合并,逗号分隔.

  8. FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换

    当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...

  9. bash shell脚本之成员变量

    shell中变量的使用 cat test3: #!/bin/bash # testing variables days= guest="Katie" echo "$gue ...

  10. 如何远程调试部署在CloudFoundry平台上的nodejs应用

    网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等. 在实际情况中,我们可能遇到本地运行良好 ...