传送门

设$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. binary-tree-postorder-traversal——二叉树后续遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  2. apk解包——修改后缀为zip

    将apk修改后缀为zip后,可直接解包查看资源文件

  3. Yelp面试题目

    题目:FizzBuzz 从stdin得到数字N(<10^7),然后从打印出从1到N的数字.输出到stdout,假设数字是3的倍数的话就仅仅打印"Buzz",假设数字是5的倍数 ...

  4. 关于Activity启动模式(launchMode)和intent设置测试后 发现和网上说的不符 是不是我错了 求解

    看了很多关于Activity启动模式(launchMode)和intent设置intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);发现网上说的和我测试结果 ...

  5. java中类加载顺序(深入Java)

    未涉及虚拟机 0.<init>与<clinit>的区别 1.类的加载过程 2.类的使用方式 3.类的加载来源 4.重载之泛型参数不同可以吗 5.参考 引子 记得上次中秋一哥们写 ...

  6. WIN7不能被远程桌面问题

    不知从何时起,我的机器不能被远程桌面.在其他机器远程我,最后都提示"凭据不工作",账号和密码肯定是正确的. 我是开了远程桌面的: 也许是新近开了防火墙的缘故?检查防火墙,3389是 ...

  7. python模拟登陆discuz论坛

    #! /usr/bin/env python # -*- coding: utf-8 -*- import urllib2, urllib, cookielib, re, time class Rob ...

  8. 基于Python 的简单推荐系统

    def loadExData(): return[[1,1,1,0,0], [2,2,2,0,0], [1,1,1,0,0], [5,5,5,0,0], [1,1,0,2,2], [0,0,0,3,3 ...

  9. 织梦文章页调用当前栏目名称和url地址的方法

    其实织梦本身有这2个调用标签,可能大家没怎么注意,下面的代码就是织梦文章页调用当前栏目名称和url地址的方法: {dede:field name='typeurl' function=”GetType ...

  10. 【Selenium】验证是否按照字母顺序排列, 不区分大小写

    验证是否按照字母顺序排列, 不区分大小写 for(int j=0;j<s.length-1;j++){ String temp1=s[j].toLowerCase(); String temp2 ...