【BZOJ1864】三色二叉树(动态规划)

题面

BZOJ

题解

首先把树给构出来。

设\(f[i][0/1]\)表示当前节点\(i\),是否是绿色节点的子树中最大/最小的绿色节点的个数和。

转移很显然。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 500500
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
char ch[MAX];
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1,son[MAX];
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;++son[u];}
int pos=1,tot;
void Build(int nw)
{
if(ch[pos]=='0')return;
if(ch[pos]=='1')
{
++pos;Add(nw,++tot);Build(tot);
return;
}
else
{
++pos;Add(nw,++tot);Build(tot);
++pos;Add(nw,++tot);Build(tot);
return;
}
}
int f[MAX][2];
void dfs1(int u)
{
if(!son[u])f[u][0]=0,f[u][1]=1;
else if(son[u]==1)
{
int v=e[h[u]].v;
dfs1(v);
f[u][0]=max(f[v][0],f[v][1]);
f[u][1]=f[v][0]+1;
}
else
{
int v1=e[h[u]].v,v2=e[e[h[u]].next].v;
dfs1(v1);dfs1(v2);
f[u][0]=max(f[v1][0]+f[v2][1],f[v1][1]+f[v2][0]);
f[u][1]=f[v1][0]+f[v2][0]+1;
}
}
void dfs2(int u)
{
if(!son[u])f[u][0]=0,f[u][1]=1;
else if(son[u]==1)
{
int v=e[h[u]].v;
dfs2(v);
f[u][0]=min(f[v][0],f[v][1]);
f[u][1]=f[v][0]+1;
}
else
{
int v1=e[h[u]].v,v2=e[e[h[u]].next].v;
dfs2(v1);dfs2(v2);
f[u][0]=min(f[v1][0]+f[v2][1],f[v1][1]+f[v2][0]);
f[u][1]=f[v1][0]+f[v2][0]+1;
}
}
int main()
{
scanf("%s",ch+1);
Build(tot=1);
memset(f,0,sizeof(f));dfs1(1);printf("%d ",max(f[1][0],f[1][1]));
memset(f,0,sizeof(f));dfs2(1);printf("%d\n",min(f[1][0],f[1][1]));
return 0;
}

【BZOJ1864】三色二叉树(动态规划)的更多相关文章

  1. bzoj1864 三色二叉树

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

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

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

  3. 【BZOJ-1864】三色二叉树 树形DP

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

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

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

  5. bzoj千题计划212:bzoj1864: [Zjoi2006]三色二叉树

    http://www.lydsy.com/JudgeOnline/problem.php?id=1864 #include<cstdio> #include<cstring> ...

  6. 嘴巴题5 「BZOJ1864」[ZJOI2006] 三色二叉树

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1195 Solved: 882 [Submit][Status ...

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

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

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

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

  9. 【BZOJ】1864: [Zjoi2006]三色二叉树

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

随机推荐

  1. TensorFlow Python2.7环境下的源码编译(二)安装配置

    源代码树的根目录中包含了一个名为 configure 的 bash 脚本. $ ./configure 接下来,配置系统会给出各种询问,以确认编译时的配置参数.   一.重要参数解释 Do you w ...

  2. NIO - Buffer

    NIO —— Buffer源码分析 Buffer的类结构 底层的基础类是抽象类-Buffer,其中定义了四个变量:capacity(容量),limit(限制),position(位置),mark(标记 ...

  3. 【Unity】 Cursor学习

    CursorLockMode.None 光标行为未修改,第一人称视角下鼠标可以突破窗口. CursorLockMode.Locked 光标锁定到游戏窗口的中心,与全屏与否无关,同时隐藏光标(这一点在3 ...

  4. Firefox浏览器【书签工具栏】里的网址链接无法删除的解决办法

    今天使用Firefox浏览器,发现有一些我从来都没有访问的网站出现在[书签工具栏], 也不知道是什么原因被添加进来的(可能是安装某个插件被插的),于是点删除,发现还删除不了,很是老火,研究了一番,把删 ...

  5. QRCode 二维码

    一.生成二维码 1.二维码就是绘制成黑白相间的图片,所谓的黑白相间就是代表0和1 ,二维码大约可以容纳500多个中文,所以用途之广显而易见. 所需的jar包  http://pan.baidu.com ...

  6. centos7.6 安装nginx-1.14.2

    一.安装所需依赖环境 yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 二.下载nginx官方源 ...

  7. Google hack语法

    基础语法: 1.语法说明: inurl: 在url地址栏中显示的信息页面 intext: 显示在正文信息中的内容页面 site: 限制显示你某个域名的所有页面 filetype: 搜索文件的后缀或者扩 ...

  8. bg,fg,job命令详解

    基础命令学习目录首页 原文链接:http://www.cnblogs.com/chjbbs/p/6307333.html linux提供的fg和bg命令,可以让我们轻松调度正在运行的任务 假如你发现前 ...

  9. 实验三— —敏捷开发与XP实践

    ---恢复内容开始--- java的第二个实验——JAVA面向对象程序设计 北京电子科技学院 实     验    报     告 课程:Java程序设计 班级:1352 姓名:林涵锦 学号:2013 ...

  10. 初学Cocos2dx

    初学cocos2dx Cocos2dx 中的主要概念包括:应用.导演.场景.层.精灵.动画.动作. Cocos2dx里面的主要类 1.CCObject Object Object Object 是co ...