题目描述

输入输出格式

输入格式:

输入文件名:TRO.IN

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

输出格式:

输出文件名:TRO.OUT

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

输入输出样例

输入样例#1:

1122002010
输出样例#1:

5 2

似乎已经很久没有写博客了
今天是noip2017初赛,离noip2017复赛还有不到一个月,我要加油做题了! 题解:
首先得能通过输入的一串树把树的形态搞出来。自己模拟模拟后发现这个“二叉树序列”跟dfs差不多,用一个dfs就知道树是什么样的了。
在dfs时记录该节点有几个子节点(只可能是0、1、2),顺便记下子节点的编号。
之后计算最多最少几个节点被染成绿色就可以用dp了
至于问什么会想到dp呢?我猜是一个经验问题吧。
一开始想起来虽觉得不好算,但大问题可以转化为子问题后解决。对于每一个小部分求出最值后进一步求出稍大一部分的最值。
由于要求最大值与最小值,所以我用了两个dp数组。
dp[i][k]表示第i号节点的颜色为k,它与它子树中颜色为绿的的最大值。(在前面的dfs中根据dfs序可知每一个子树中的节点编号连续,且根节点是最小的)
转移方程有些长,直接看下面代码吧,懒得再写一遍了。
方程基本就是对于该节点的一种状态求出子节点可能的不同状态(状态数并不多)中的最值。
之后就可以啦 总结一下思路:
弄清楚“二叉树序列”的本质 -> 发现大问题难以求解,但可通过子问题计算出 -> 进行dp 注意:题目很坑,数据范围是有问题的,最多可能输入长度为500000 代码:
 #include<cstdio>
#include<iostream>
using namespace std; const int MAXN=;
int sonnum[MAXN],son[MAXN][];
int num=,root; char ch;
void input(int u){
sonnum[u]=ch-'';
if(ch-''==) return;
else if(ch-''==){
son[u][]=++num;
ch=getchar();
input(num);
}
else{
son[u][]=++num;
ch=getchar();
input(num);
son[u][]=++num;
fa[num]=u;
ch=getchar();
input(num);
}
}
int dp[MAXN][],dp2[MAXN][]; int main()
{
int i,j,x;
ch=getchar();
while(ch<'' || ch>'') ch=getchar(); root=++num;
input(root); for(i=num;i>;i--){
if(sonnum[i]==){
dp[i][]=;
dp[i][]=dp[i][]=; dp2[i][]=;
dp2[i][]=dp2[i][]=;
}
else if(sonnum[i]==){
dp[i][]=max(dp[son[i][]][],dp[son[i][]][])+;
dp[i][]=max(dp[son[i][]][],dp[son[i][]][]);
dp[i][]=max(dp[son[i][]][],dp[son[i][]][]); dp2[i][]=min(dp2[son[i][]][],dp2[son[i][]][])+;
dp2[i][]=min(dp2[son[i][]][],dp2[son[i][]][]);
dp2[i][]=min(dp2[son[i][]][],dp2[son[i][]][]);
}
else {
dp[i][]=max(dp[son[i][]][]+dp[son[i][]][],dp[son[i][]][]+dp[son[i][]][])+;
dp[i][]=max(dp[son[i][]][]+dp[son[i][]][],dp[son[i][]][]+dp[son[i][]][]);
dp[i][]=max(dp[son[i][]][]+dp[son[i][]][],dp[son[i][]][]+dp[son[i][]][]); dp2[i][]=min(dp2[son[i][]][]+dp2[son[i][]][],dp2[son[i][]][]+dp2[son[i][]][])+;
dp2[i][]=min(dp2[son[i][]][]+dp2[son[i][]][],dp2[son[i][]][]+dp2[son[i][]][]);
dp2[i][]=min(dp2[son[i][]][]+dp2[son[i][]][],dp2[son[i][]][]+dp2[son[i][]][]);
}
}
printf("%d ",max(dp[][],max(dp[][],dp[][])));
printf("%d\n",min(dp2[][],min(dp2[][],dp2[][])));
return ;
}

洛谷P2585 [ZJOI2006]三色二叉树的更多相关文章

  1. 【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树

    [树形DP]三色二叉树 标签(空格分隔): 树形DP [题目] 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1 ...

  2. 洛谷P2585 [ZJOI2006]三色二叉树(树形dp)

    传送门 设$dp[u][i]$表示点$u$颜色为$i$时最多(最少)的绿点个数(这里用$0$表示绿点) 然后直接用树形dp就可以了 记得把情况讨论清楚 //minamoto #include<b ...

  3. 【洛谷P2585】三色二叉树

    题目大意:给定一个二叉树,可以染红绿黄三种颜色,要求父节点和子节点的颜色不同,且如果一个节点有两个子节点,那么两个子节点之间的颜色也不同.求最多和最少有多少个节点会被染成绿色. 题解:加深了对二叉树的 ...

  4. 洛谷 2585 [ZJOI2006]三色二叉树——树形dp

    题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...

  5. luogu P2585 [ZJOI2006]三色二叉树

    P2585 [ZJOI2006]三色二叉树 题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO ...

  6. P2585 [ZJOI2006]三色二叉树

    题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数, ...

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

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

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

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

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

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

随机推荐

  1. eslint的使用和配置

    eslint的使用和配置 什么是eslint ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误.在许多方面,它和 J ...

  2. 使用git命令修改commit提交信息

    很多时候我们在提交代码时可能会把commit提交信息写错了,这个时候我们就可以用到下面的git命令来修改commit提交信息 git commit --amend 输入"i"之后进 ...

  3. CF1151div2(Round 553)

    CF1151div2(Round 553) 思路题大赛 A 少考虑了一种情况,到死没想到 B 貌似我随机化50000次,没找到就无解貌似也过了 感觉随随便便乱搞+分类讨论都可以过的样子 #includ ...

  4. 初识Ubuntu 18.04(更换系统头像,截图,sy)

    其实我认识ubuntu也有一段时间了,只是我一直沉迷Windows无法自拔,但是熟悉一下ubuntu的环境对于各项比赛以及今后的工作还是很有用处的,不过在未来的很长一段时间里,我只会以一个普通用户的身 ...

  5. oracle中update语句修改多个字段

    如需要修改下列数据:表名为student 一般会这样写: update student set sname = '李四', sage = 20, sbirthday = to_date('2010-0 ...

  6. 这群程序员疯了!他们想成为IT界最会带货的男人

    随着网红主播越来越火,通过直播带货种草的形式也成了今年双12的热点. 不过,网红主播带货早已见怪不怪,但你们见过程序员直播带货吗!? 近日,趁着阿里云双12年末采购节,阿里云邀请了一波程序员GG来为大 ...

  7. JSR303 数据检验

    原文:https://blog.csdn.net/qq_28867949/article/category/7370730 一.JSR-303简介 JSR-303 是 JAVA EE 6 中的一项子规 ...

  8. pytorch torch.Stroage();torch.cuda()

    转自:https://ptorch.com/news/52.html torch.Storage是单个数据类型的连续的一维数组,每个torch.Tensor都具有相同数据类型的相应存储.他是torch ...

  9. 超简单!pytorch入门教程(一):Tensor

    http://www.jianshu.com/p/5ae644748f21 二.pytorch的基石--Tensor张量 其实标量,向量,矩阵它们三个也是张量,标量是零维的张量,向量是一维的张量,矩阵 ...

  10. 洛谷$P$3241 开店 $[HNOI2015]$ 主席树/点分治

    正解:主席树/动态点分治 解题报告: 传送门! $umm$淀粉质的话要是动态的我还不会$QAQ$,,,所以先写下主席树的题解昂$QwQ$ 题目大意是说,给定一棵树,树上每个点都有个值,然后有若干个询问 ...