传送门

设$dp[u][i]$表示点$u$颜色为$i$时最多(最少)的绿点个数(这里用$0$表示绿点)

然后直接用树形dp就可以了

记得把情况讨论清楚

 //minamoto
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
const int N=5e5+;
char s[N];int n,cnt,L[N],R[N],dp[N][];
void dfs(int u){
++cnt;
switch(s[u]){
case :break;
case :L[u]=cnt,dfs(cnt);break;
case :L[u]=cnt,dfs(cnt),R[u]=cnt,dfs(cnt);break;
}
}
#define ls L[u]
#define rs R[u]
void dfsmax(int u){
if(!ls) return (void)(dp[u][]=,dp[u][]=dp[u][]=);
dfsmax(ls);
if(rs) dfsmax(rs);
dp[u][]=dp[u][]=dp[u][]=;
if(rs){
cmax(dp[u][],dp[ls][]+dp[rs][]+),
cmax(dp[u][],dp[ls][]+dp[rs][]+); cmax(dp[u][],dp[ls][]+dp[rs][]),
cmax(dp[u][],dp[ls][]+dp[rs][]); cmax(dp[u][],dp[ls][]+dp[rs][]),
cmax(dp[u][],dp[ls][]+dp[rs][]);
}else{
cmax(dp[u][],dp[ls][]+),cmax(dp[u][],dp[ls][]+);
cmax(dp[u][],dp[ls][]),cmax(dp[u][],dp[ls][]);
cmax(dp[u][],dp[ls][]),cmax(dp[u][],dp[ls][]);
}
}
void dfsmin(int u){
if(!ls) return (void)(dp[u][]=,dp[u][]=dp[u][]=);
dfsmin(ls);
if(rs) dfsmin(rs);
dp[u][]=dp[u][]=dp[u][]=inf;
if(rs){
cmin(dp[u][],dp[ls][]+dp[rs][]+),
cmin(dp[u][],dp[ls][]+dp[rs][]+); cmin(dp[u][],dp[ls][]+dp[rs][]),
cmin(dp[u][],dp[ls][]+dp[rs][]); cmin(dp[u][],dp[ls][]+dp[rs][]),
cmin(dp[u][],dp[ls][]+dp[rs][]);
}else{
cmin(dp[u][],dp[ls][]+),cmin(dp[u][],dp[ls][]+);
cmin(dp[u][],dp[ls][]),cmin(dp[u][],dp[ls][]);
cmin(dp[u][],dp[ls][]),cmin(dp[u][],dp[ls][]);
}
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%s",s+),n=strlen(s+);
for(int i=;i<=n;++i) s[i]-='';
cnt=,dfs();
dfsmax(),printf("%d ",max(dp[][],max(dp[][],dp[][])));
dfsmin(),printf("%d\n",min(dp[][],min(dp[][],dp[][])));
return ;
}

洛谷P2585 [ZJOI2006]三色二叉树(树形dp)的更多相关文章

  1. 洛谷 2585 [ZJOI2006]三色二叉树——树形dp

    题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...

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

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

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

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

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

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

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

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

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

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

  7. [luogu2585 ZJOI2006] 三色二叉树 (树形dp)

    传送门 Description Input 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件名:TRO.OUT 输出文件也只有一行,包 ...

  8. 【洛谷P2585】三色二叉树

    题目大意:给定一个二叉树,可以染红绿黄三种颜色,要求父节点和子节点的颜色不同,且如果一个节点有两个子节点,那么两个子节点之间的颜色也不同.求最多和最少有多少个节点会被染成绿色. 题解:加深了对二叉树的 ...

  9. BZOJ 1864: [Zjoi2006]三色二叉树 树形DP + 读入

    Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 题解:本题大水 ...

随机推荐

  1. POJ 3928 Ping pong 树状数组模板题

    開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...

  2. Delphi和C++的语法区别 (关于构造和析构)

    目录 Delphi永远没办法在栈上创建一个对象 Delphi的构造函数更象是个类方法(静态成员函数) Delphi的析构函数中可以调用纯虚方法 Delphi在构造对象时自动将成员变量清零 Delphi ...

  3. chmod|chown|chgrp和用法和区别

    1.chgrp(改变文件所属用户组) chgrp 用户组   文件名   ###就是这个格了.如果整个目录下的都改,则加-R参数用于递归. 如:chgrp -R   user smb.conf 2.c ...

  4. Ural 1635 Mnemonics and Palindromes(DP)

    题目地址:space=1&num=1635">Ural 1635 又是输出路径的DP...连着做了好多个了. . 状态转移还是挺简单的.要先预处理出来全部的回文串,tag[i] ...

  5. android 提示

    1.Toast: Toast toast=new Toast(context); Toast.makeText(context, text, duration);//返回值为Toast toast.s ...

  6. ReactNative Android 研究

    先从ReactRootView入手吧,它是一个FrameLayout mReactRootView.startReactApplication 这的start其实是会等到inital onMeasur ...

  7. YTU 2457: 很简单的一道题

    2457: 很简单的一道题 时间限制: 1 Sec  内存限制: 128 MB 提交: 261  解决: 80 [提交][状态][讨论版] 题目描述 有一个简单的函数数学公式,如下 输入 重复输入多组 ...

  8. Collections工具类、Map集合、HashMap、Hashtable(十八)

    1.Map集合概述和特点 * A:Map接口概述 * 去重复, * 查看API可以知道, * 将键映射到值的对象, * 一个映射不能包含重复的键, * 每个键最多只能映射到一个值.* B:Map接口和 ...

  9. 通过ODC方法改善软件测试:3个案例研究

    正交缺陷分类法(ODC)是一种用于分析软件缺陷的归类方法.它可以结合软件开发过程的一系列数据分析技术,为测试组织提供了一个强大的针对开发过程和软件产品的评估方法.在本篇文章中,会列举三个案例研究来说明 ...

  10. 根据用户时区显示当地时间 javascript+php

    在跨时区应用中会用到下面代码,这是以前写的一段代码. 服务器保存相关时间配置,保存形式为GMT时间,客户端需要根据客户所在时区做相应显示,以符合客户习惯. ​1. [代码][JavaScript]代码 ...