题目描述 Description

一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”:

|-0  表示该树没有子节点

S = |-1S1 表示该树有一个子节点,S1为其子树的二叉树排列

|- 2S1S2 表示该树有连个个子节点,S1、S2为其子树的二叉树排列

你的任务是要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿色或蓝色。并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。

输入描述 Input Description

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

输出描述 Output Description

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

样例输入 Sample Input

1122002010

样例输出 Sample Output

5 2

数据范围及提示 Data Size & Hint

 

之前的一些废话:准备期末复习。

题解:

f(i,0)表示这个点不为绿色
0个儿子:0
1个儿子:max(f(s,1),f(s,0))
2个儿子:max(f(s1,1)+f(s2,0),f(s1,0)+f(s2,2))

f(i,1)表示这个点为绿色
0个儿子:1
一个儿子:f(s,0)+1
两个儿子:f(s1,0)+f(s2,0)+1

g(i,0)表示这个点不为绿色
0个儿子:0
1个儿子:min(g(s,1),g(s,0))
2个儿子:min(g(s1,1)+g(s2,0),g(s1,0)+g(s2,2))

f(i,1)表示这个点为绿色
0个儿子:1
一个儿子:g(s,0)+1
两个儿子:g(s1,0)+g(s2,0)+1

然后把输入转化成一颗树的话。。下面代码已经写了。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
#define mem(a,b) memset(a,b,sizeof(a))
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
const int maxn=;
char s[maxn];
int len,tot=,f[][maxn],g[][maxn],l[maxn],r[maxn];
void DP(int now)
{
if(tot>len)return;
f[][now]=;g[][now]=;
if(s[now]=='')return;
if(s[now]=='')
{
tot++;l[now]=tot;DP(tot);
f[][now]+=max(f[][l[now]],f[][l[now]]);
f[][now]+=f[][l[now]];
g[][now]+=min(g[][l[now]],g[][l[now]]);
g[][now]+=g[][l[now]];
}
if(s[now]=='')
{
tot++;l[now]=tot;DP(tot);
tot++;r[now]=tot;DP(tot);
f[][now]+=max(f[][l[now]]+f[][r[now]],f[][l[now]]+f[][r[now]]);
f[][now]+=f[][l[now]]+f[][r[now]];
g[][now]+=min(g[][l[now]]+g[][r[now]],g[][l[now]]+g[][r[now]]);
g[][now]+=g[][l[now]]+g[][r[now]];
}
}
int main()
{
scanf("%s",s+);
len=strlen(s+);
DP();
printf("%d %d\n",max(f[][],f[][]),min(g[][],g[][]));
return ;
}

总结:

[BZOJ1864][CODEVS2462]三色二叉树的更多相关文章

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

    [BZOJ1864]三色二叉树(动态规划) 题面 BZOJ 题解 首先把树给构出来. 设\(f[i][0/1]\)表示当前节点\(i\),是否是绿色节点的子树中最大/最小的绿色节点的个数和. 转移很显 ...

  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. bzoj千题计划212:bzoj1864: [Zjoi2006]三色二叉树

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

  5. bzoj1864 [Zjoi2006]三色二叉树

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

  6. 【题解】 bzoj1864: [Zjoi2006]三色二叉树 (动态规划)

    bzoj1864,懒得复制,戳我戳我 Solution: 其实想出来了\(dp\)方程推出来了最大值,一直没想到推最小值 \(dp[i][1/0]\)表示\(i\)号节点的子树中的绿色染色最大值,\( ...

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

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

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

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

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

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

随机推荐

  1. vue_03day

    目录 作业: vue组件操作页面渲染: 组件渲染: 作业: vue组件操作页面渲染: 1.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/0 ...

  2. webpack打包教程(一)常用loader详解

    1.打包图片 // { // test: /\.(png|jpe?g|gif)$/i, // use: [{ // loader: 'file-loader', // options: { // na ...

  3. 大话设计模式Python实现-原型模式

    原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 一个原型模式的简单demo: #!/usr/bin/env python # -*- c ...

  4. linq 大数据 sql 查询及分页优化

    前提: 需要nuget   PredicateLib   0.0.5: SqlServer  2008R2 (建议安装 64 位): .net 4.5 或以上: 当前电脑配置: I7 4核  3.6G ...

  5. sql语句规范参考

    公司有SQL语句规范的参考,这里特别做个笔记. 书写风格 1. 语句关键字应全部使用小写. 2. 引用字符时应使用单引号.如:update testable set idcol=’abcd’. 3. ...

  6. IDEA设置方法参数列表类型自动提示

    默认情况下,IDEA的提示不够完全,可以通过以下设置,将提示功能打开的更完善. 效果如下面俩图所示

  7. lego loam 跑镭神32线激光雷达

    师弟反应镭神32线激光雷达(32C)录制的数据包不能跑lego loam,这里就总结一下. 首先lego loam默认的接受的topic name是velodyne_points,点云的frame_i ...

  8. yii2.0的学习之旅(一)

    一. 通过composer安装yii2.0项目 *本文是根据您已经安装了composer (1)跳转到项目根目录 cd /xxxx/www (2)下载插件 composer global requir ...

  9. C#使用FileSystemWatcher来监控指定文件夹,并使用TCP/IP协议通过Socket发送到另外指定文件夹

    项目需求: 局域网内有两台电脑,电脑A(Windows系统)主要是负责接收一些文件(远程桌面粘贴.FTP上传.文件夹共享等方式),希望能在A接收文件后自动传输到电脑B(Windows系统)来做一个备份 ...

  10. sqlserver the name is not a valid identifier error in function

    参考资料:https://stackoverflow.com/questions/22008859/the-name-is-not-a-valid-identifier-error-in-functi ...