luogu P2585 [ZJOI2006]三色二叉树
P2585 [ZJOI2006]三色二叉树
题目描述

输入输出格式
输入格式:
输入文件名:TRO.IN
输入文件仅有一行,不超过10000个字符,表示一个二叉树序列。
输出格式:
输出文件名:TRO.OUT
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
输入输出样例
1122002010
5 2
思路:
我们只关心绿色节点的数目,而红色蓝色可以看作无色,
但是对于一个根节点和它的两个儿子,必须有一个绿色节点
按照树形DP的思路,我们开一个二维数组dp[Maxn][2]
一二维分别保存:
该树的最优数目,该根节点涂绿色与不涂绿色[1表示涂绿色,0表示不涂]
以最大绿色数为例:
dp[i][0]=max(dp[left[i]][1]+dp[right[i]][0],dp[left[i]][0]+dp[right[i]][1]);
如果不涂i节点, 那么i节点的子节点一定要有一个涂, 所以要么左为1右为0, 要么左为0右为1
即:
dp[i][1]=dp[left[i]][0]+dp[right[i]][0]+1
如果涂i节点,那么它的两个儿子当然都不能涂! [别忘了还需要加上1,即:统计上i节点的绿色]
最小绿色也是一个道理,只要把max改为min即可:
dp[i][0]=min(dp[left[i]][1]+dp[right[i]][0],dp[left[i]][0]+dp[right[i]][1]);
坑点:
数据范围是个大坑....应该开到10万才可以,他少打了个0....
上代码:
/*
Max
dp[i][1]=dp[left[i]][0]+dp[right[i]][0]+1
Min
dp[i][0]=min(dp[left[i]][1]+dp[right[i]][0],dp[left[i]][0]+dp[right[i]][1]);
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std; const int Maxn = ;
const int Colors = ;
int rt,top=;
int L[Maxn],R[Maxn];
///第一维表示第几个点,第二维表示染什么颜色
int dpMax[Maxn][Colors],dpMin[Maxn][Colors]; int Max(int a, int b)
{return a > b ? a : b;}
int Min(int a, int b)
{return a < b ? a : b;} int build() {
top++;
int num=top;
int son=getchar()-'';
///默认为son==0时没有孩子,son==1时只有左孩子,son==2时左右均有.
if(son==) {
L[num]=;
R[num]=;
}
else if(son==) {
L[num]=build();
R[num]=;
}
else {
L[num]=build();
R[num]=build();
}
///返回孩子编号
return num;
}
///找较大值
void findMax(int u) {
if(dpMax[L[u]][]==-)
findMax(L[u]);
if(dpMax[R[u]][]==-)
findMax(R[u]);
dpMax[u][]=Max(dpMax[L[u]][]+dpMax[R[u]][],dpMax[L[u]][]+dpMax[R[u]][]);
dpMax[u][]=dpMax[L[u]][]+dpMax[R[u]][]+;
}
///找较小值
void findMin(int u) {
if(dpMin[L[u]][]==-)
findMin(L[u]);
if(dpMin[R[u]][]==-)
findMin(R[u]);
dpMin[u][]=Min(dpMin[L[u]][]+dpMin[R[u]][],dpMin[L[u]][]+dpMin[R[u]][]);
dpMin[u][]=dpMin[L[u]][]+dpMin[R[u]][]+;
} int main() {
rt=build();
memset(dpMax,-,sizeof(dpMax));
memset(dpMin,-,sizeof(dpMin));
///空节点为0,便于更新
dpMax[][]=dpMax[][]=;
dpMin[][]=dpMin[][]=;
findMax(rt);
findMin(rt);
int a1=Max(dpMax[rt][],dpMax[rt][]),
a2=Min(dpMin[rt][],dpMin[rt][]);
printf("%d %d",a1,a2);
return ;
}
luogu P2585 [ZJOI2006]三色二叉树的更多相关文章
- 【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树
[树形DP]三色二叉树 标签(空格分隔): 树形DP [题目] 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1 ...
- P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数, ...
- 洛谷P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...
- 洛谷P2585 [ZJOI2006]三色二叉树(树形dp)
传送门 设$dp[u][i]$表示点$u$颜色为$i$时最多(最少)的绿点个数(这里用$0$表示绿点) 然后直接用树形dp就可以了 记得把情况讨论清楚 //minamoto #include<b ...
- [ZJOI2006]三色二叉树
[ZJOI2006]三色二叉树 BZOJ luogu 分3种颜色讨论转移一下 #include<bits/stdc++.h> using namespace std; const int ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )
难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...
- BZOJ_1864_[Zjoi2006]三色二叉树_树形DP
BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...
随机推荐
- HTNL基础之二
HTML实体字符 “<”:< “>”:> “空格”: ' / / ' “"”:" “®”:® “©”:© 列表 ①无序列表:列表用来在网页上组织信息, ...
- Python基础总结之第七天开始【认识函数的参数以及返回】(新手可相互督促)
周日的早上,吃的饱饱,刷刷抖音,开始学习新一天的知识了~~~ 函数的参数: 昨天的笔记中,我们已经使用了参数,在案例中的name和sex 就是参数. 一般的函数都是有参数的,函数的参数都是放在函数定义 ...
- xshell和xftp过期解决办法
去官网 xshell:https://www.netsarang.com/download/down_form.html?code=522 xftp:https://www.netsarang.com ...
- MySQL Select语句的执行顺序
源文章:How is a query executed in MySQL? 当执行SQL的Select查询语句时,SQL指令的执行顺序如下: FROM 子句 WHERE 子句 GROUP BY 子句 ...
- Spring MVC 探讨DispatcherServlet
先上DispatcherServlet的运行流程图(request processing):
- async/await 的引用
static async void Start() { string s = "ass"; Console.WriteLine(getMemory(s)+"Hello W ...
- 基于【 springBoot +springCloud+vue 项目】二 || 后端框架详解
前言 在上一篇中,我们搭建了一个-API服务提供接口模块,目的为了提供了消费方进行调用.为什么不直接在service层直接提供调用接口,而是重新创建一个接口层模块?首先我们需要对Feign有所了解. ...
- 很low的四位验证码实现
<html> <head> <meta charset="utf-8"> </head> <body> <inpu ...
- MUI 支付案例(支付宝/微信)
首先说明一下,本文借鉴了多位博主的文章,所以会看到很多一样的代码. 写这篇博客主要目的是为了便于后期查看(不好之处,敬请留言吐槽),案例经本人测试,是可以使用的. 先上效果图 前端HTML代码: &l ...
- BPM软件_K2再度入选Gartner iBPMS MQ挑战者象限_全球领先的工作流引擎
在Gartner 于1月最新发布的2018 iBPMS MQ报告中,K2再度入选“挑战者”象限,相较去年,K2在“前瞻性”方面有了显著提升. Gartner对该标准的定义为:供应商对市场具有清晰认识, ...