树形dp——三色二叉树
题目描述
一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”:
0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 该树有两个子节点,S1,S2分别为两个二叉树的序列 例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示。
你的任务是要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿色或蓝色。并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。
输入格式
输入文件仅有一行,不超过10000个字符,表示一个二叉树序列
输出格式
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
样例
样例输入
1122002010
样例输出
5 2
题目分析
讲真第一眼看见这道题想起了刚学的排列组合emmm
- 这题看起来花里胡哨,其实搞懂题以后,还是比较暴力的
- 关键点:
- 如何建树:根据题意,子串的每一个字符都代表着分支,重点在分支为0这里,分支为0说明走到了根节点,直接返回即可
- 转移方程:每个点都可以涂三种颜色,每种颜色都试一下,加上子树的dp值,而且要分开保存,最大值最小值要分开,不同的颜色也要分开,最后统一比较即可
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn =1e4+10;
char s[maxn];
int f1[maxn][3],f2[maxn][3];//f1是最大值,f2是最小值,再多开一维数组记录所涂颜色
int dfs(int root){ //返回每个子树跑dfs的末尾元素
if(s[root] == '0'){
f1[root][0] = f2[root][0] = 1;
return root;
}
int left = dfs(root+1);
if(s[root] == '1'){//根据颜色的互异性,直接分情况讨论
f1[root][0] = max(f1[root+1][1],f1[root+1][2])+1;
f1[root][1] = max(f1[root+1][0],f1[root+1][2]);
f1[root][2] = max(f1[root+1][0],f1[root+1][1]);
f2[root][0] = min(f2[root+1][1],f2[root+1][2])+1;
f2[root][1] = min(f2[root+1][0],f2[root+1][2]);
f2[root][2] = min(f2[root+1][0],f2[root+1][1]);
return left;
}
if(s[root] == '2'){//有两个子树,还需要从左子树的末尾接着跑,找出右子树
int right = dfs(left+1);
f1[root][0] = max(f1[root+1][1]+f1[left+1][2],f1[root+1][2]+f1[left+1][1])+1;
f1[root][1] = max(f1[root+1][0]+f1[left+1][2],f1[root+1][2]+f1[left+1][0]);
f1[root][2] = max(f1[root+1][0]+f1[left+1][1],f1[root+1][1]+f1[left+1][0]);
f2[root][0] = min(f2[root+1][1]+f2[left+1][2],f2[root+1][2]+f2[left+1][1])+1;
f2[root][1] = min(f2[root+1][0]+f2[left+1][2],f2[root+1][2]+f2[left+1][0]);
f2[root][2] = min(f2[root+1][0]+f2[left+1][1],f2[root+1][1]+f2[left+1][0]);
return right;
}
}
int main(){
cin>>s;
dfs(0);
int MAX = max(f1[0][0],max(f1[0][1],f1[0][2]));//三种情况进行比较,得出最大值
int MIN = min(f2[0][0],min(f2[0][1],f2[0][2]));//得出最小值
printf("%d %d",MAX,MIN);
}
树形dp——三色二叉树的更多相关文章
- 【BZOJ-1864】三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 659 Solved: 469[Submit][Status] ...
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- BZOJ_1864_[Zjoi2006]三色二叉树_树形DP
BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...
- 【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树
[树形DP]三色二叉树 标签(空格分隔): 树形DP [题目] 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1 ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
- BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )
难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...
- 三色二叉树——树形dp
三色二叉树 题目描述 一棵二叉树可以按照如下规则表示成一个由 \(0.1.2\) 组成的字符序列,我们称之为"二叉树序列 \(S\) ": \(0\) 该树没有子节点. \(1S_ ...
- BZOJ 1864:[Zjoi2006]三色二叉树(树DP)
三色二叉树 问题描述 输入 仅有一行,不超过500000个字符,表示一个二叉树序列. 输出 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 样例输入 1122002010 ...
- luogu P2585 [ZJOI2006]三色二叉树
P2585 [ZJOI2006]三色二叉树 题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO ...
随机推荐
- Java实现控制台版CS
也可以把这四个类直接复制下去放在一个包下面 父类 package Cs1_6; public abstract class Persion { public abstract void Attack( ...
- STM32F429时钟不正确导致串口无法正确收发
老早之前自己做了块F4的板子,设计原理图时没有去找官方参考,看了手册后就开工了,做完板子回来测试串口发现PC端接收到的都是乱码,尝试了几种波特率也没能正确接收,串口的代码是官方参考例程的,不应该有问题 ...
- 别在重复造轮子了,几个值得应用到项目中的 Java 开源库送给你
我是风筝,公众号「古时的风筝」.文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面.公众号回复『666』获取高清大图. 风筝我作为一个野路子开发者,直到 ...
- pyqt5 主界面打开新主界面的实现
import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ###### ...
- .Net Core微服务入门全纪录(四)——Ocelot-API网关(上)
前言 上一篇[.Net Core微服务入门全纪录(三)--Consul-服务注册与发现(下)]已经使用Consul完成了服务的注册与发现,实际中光有服务注册与发现往往是不够的,我们需要一个统一的入口来 ...
- WeChair项目Alpha冲刺(6/10)
团队项目进行情况 1.昨日进展 Alpha冲刺第六天 昨日进展: 前端:和后端成功交互,页面修改和完善 后端:和前端成功交互,但是数据解密失败,初步编写登录的service层和dao层代码未测试 ...
- JavaWeb的登陆与注销功能
JavaWeb 登录与注销 大致流程 一般我们在Web应用中 登录页面一般是以 login.jsp的首页 大致流程如下: 当我们在前台写入用户名和密码之后,点击登录按钮 会将表单提交给一个LoginS ...
- Spring Cloud面试题万字解析(2020面试必备)
1.什么是 Spring Cloud? Spring cloud 流应用程序启动器是 于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成.Spring cloud Tas ...
- 一文搞懂InnoDB索引存储结构
参考资料:掘金小册:MySQL 是怎样运行的:从根儿上理解 MySQL B+树 我们知道,InnoDB是用B+树作为组织数据形式的数据结构.不论是存放用户记录的数据页,还是存放目录项记录的数据页,我们 ...
- 【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?
写在前面 在之前的文章中,我们介绍了如何使用@Bean注解指定初始化和销毁的方法,小伙伴们可以参见<[Spring注解驱动开发]如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!& ...