洛谷 P2585 [ ZJOI 2006 ] 三色二叉树 —— 树形DP
题目:https://www.luogu.org/problemnew/show/P2585
首先,三色其实记录两种状态:是绿色,不是绿色 即可,因为红蓝可以随意取反;
一开始因为懒得还原出树,所以写了个错误贪心-_-
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=;
int k,mx,mn,siz[maxn];
char a[maxn];
int dfs()
{
k++; siz[k]=; int tmp=k;//
int nw=a[k]-'';
if(nw==)return siz[k];
else if(nw==)siz[tmp]+=dfs();
else siz[tmp]+=dfs(),siz[tmp]+=dfs();
return siz[tmp];
}
void dfsmx(int col)
{
if(col)mx++;
k++; int nw=a[k]-'';
if(nw==)return;
else if(nw==)dfsmx(!col);
else
{
if(siz[k+]<siz[k]-siz[k+])dfsmx(!col),dfsmx();
else dfsmx(),dfsmx(!col);
}
}
void dfsmn(int col)
{
if(col)mn++;
k++; int nw=a[k]-'';
if(nw==)return;
else if(nw==)dfsmn();
else
{
if(siz[k+]>siz[k]-siz[k+])dfsmn(!col),dfsmn();
else dfsmn(),dfsmn(!col);
}
}
int main()
{
scanf("%s",a+);
k=; dfs();
k=; dfsmx();
k=; dfsmn();
printf("%d %d\n",mx,mn);
return ;
}
囧
实际上是树形DP啦,f[x][0/1] 表示 x 选非绿色或绿色的最大答案,g[x][0/1] 表示最小答案;
然后转移即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=5e5+;
int n,k,ls[maxn],rs[maxn],f[maxn][],g[maxn][];
char a[maxn];
void init()
{
k++; int nw=a[k]-''; int tmp=k;
if(nw==)return;
else if(nw==)ls[tmp]=k+,init();
else ls[tmp]=k+,init(),rs[tmp]=k+,init();
}
void dfs(int x)
{
f[x][]=; g[x][]=;
if(!ls[x])return;
else if(!rs[x])
{
int u=ls[x];
dfs(u);
f[x][]+=f[u][]; f[x][]+=f[u][];
g[x][]+=g[u][]; g[x][]+=g[u][];
}
else
{
int u=ls[x],v=rs[x];
dfs(u); dfs(v);
f[x][]+=max(f[u][]+f[v][],f[u][]+f[v][]);
f[x][]+=f[u][]+f[v][];
g[x][]+=min(g[u][]+g[v][],g[u][]+g[v][]);
g[x][]+=g[u][]+g[v][];
}
}
int main()
{
scanf("%s",a+);
k=; init();
dfs();
printf("%d %d\n",max(f[][],f[][]),min(g[][],g[][]));
return ;
}
洛谷 P2585 [ ZJOI 2006 ] 三色二叉树 —— 树形DP的更多相关文章
- BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )
难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
- 【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 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- 三色二叉树——树形dp
三色二叉树 题目描述 一棵二叉树可以按照如下规则表示成一个由 \(0.1.2\) 组成的字符序列,我们称之为"二叉树序列 \(S\) ": \(0\) 该树没有子节点. \(1S_ ...
- [luogu2585 ZJOI2006] 三色二叉树 (树形dp)
传送门 Description Input 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件名:TRO.OUT 输出文件也只有一行,包 ...
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...
- BZOJ 1864: [Zjoi2006]三色二叉树 树形DP + 读入
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 题解:本题大水 ...
- 洛谷P4338 [ZJOI2018]历史(LCT,树形DP,树链剖分)
洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用? ...
随机推荐
- Centos下PHP7.1打开Oracle扩展
背景 最近因为项目研究了一下PHP集成Oracle,虽然这个组合很奇葩,但万一用到请勿采坑~ 环境 CentOS Linux release 7.3.1611 (Core) PHP7.1.1 安装or ...
- 对SpringMVC框架的理解(转)
SpringMVC概念: 他是一个轻量级的开源框架,应用于表现层,基于MVC的设计模式. SpringMVC的特点: 1.他是单例的可以设置成多例. 2.他的线程是安全的 ...
- git clone问题
中秋节回来上班 竟然忘记带电脑了  ̄□ ̄||还好同事有备用电脑,这要是回去拿估计上午都不用干什么了,用同事电脑当然需要安装环境,下面说一下git上遇到的问题吧 (1)首先我尝试用https方式克隆代码 ...
- json数据的格式,JavaScript、jQuery读取json数据
JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON的特点: JSON 是纯文本 JSON 具有“自我描述性”(人类可读) JSON 具有层级 ...
- Leetcode 208.实现前缀树
实现前缀树 实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie(); trie.insert ...
- NYOJ-769乘数密码,逆元解法;
乘数密码 时间限制:1000 ms | 内存限制:65535 KB 难度:1 -> Link <- 简单代替密码的第二种,比移位密码稍微复杂点,不过鉴于NYOJ,是完全可以 ...
- [K/3Cloud] 单据新增、复制、新增行、复制行的过程
整单复制:先执行CopyData(获得数据包),在执行AfterCreateNewData(可处理数据包),不会执行AfterCreateNewEntryRow 单据新增:先执行AfterCreate ...
- Android 网络连接状态的监控
有些应用需要连接网络,例如更新后台服务,刷新数据等,最通常的做法是定期联网,直接使用网上资源.缓存数据或执行一个下载任务来更新数据. 但是如果终端设备没有连接网络,或者网速较慢,就没必要执行这些任务. ...
- 斯特林(Stirling)公式 求大数阶乘的位数
我们知道整数n的位数的计算方法为:log10(n)+1n!=10^m故n!的位数为 m = log10(n!)+1 lgN!=lg1+lg2+lg3+lg4+lg5+................. ...
- POJ 3680_Intervals
题意: 给定区间和该区间对应的权值,挑选一些区间,求使得每个数都不被K个区间覆盖的最大权值和. 分析: 如果K=1,即为区间图的最大权独立集问题.可以对区间所有端点排序后利用动态规划的方法,设dp[i ...