bzoj1864 [Zjoi2006]三色二叉树
Description
Input
仅有一行,不超过500000个字符,表示一个二叉树序列。
Output
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
Sample Input
1122002010
Sample Output
5 2
分析:
第一次写dp1A,✿✿ヽ(°▽°)ノ✿
如果一个节点被染成绿色,那么ta的父亲,儿子和最近兄弟都不能是绿色
也就是说,一个绿色节点最多影响4个节点,最少影响1个
设计状态
f[i][0/1/2]
当前i节点,状态是0/1/2,最多有多少个绿色节点
g[i][0/1/2]
当前i节点,状态是0/1/2,最少有多少个绿色节点
tip
转移的时候耐下心来慢慢写就好
(瞎扯,ctrl+c和ctrl+v就好)
觉得唯一有点难度的就是怎么把序列还原成树的形态
dfs,记一个bh(常函数)
bh只加不减,表示序列中的指针右移
这里写代码片
#include<cstdio>
#include<iostream>
#include<cstring>using namespace std;const int N=500001;
char s[N];
int f[N][3],g[N][3],fa[N<<1],bh,ch[N][2];void dfs(int faa)
{bh++; //当前位置 ch[faa][ch[faa][0] ? 1:0]=bh;fa[bh]=faa;int x=s[bh-1]-'0';int r=bh; //局部变量,保证儿子能精准的找到爸爸if (x==2) //两个儿子 {dfs(r);dfs(r);}else if (x==1){dfs(r);}else return;
}void doit(int now)
{if (ch[now][0]) doit(ch[now][0]); //dp sonif (ch[now][1]) doit(ch[now][1]);if (!ch[now][0]&&!ch[now][1]) //leave{f[now][0]=0;f[now][1]=0;f[now][2]=1; //two means Gg[now][0]=0;g[now][1]=0;g[now][2]=1; //two means Greturn;}else if (ch[now][0]&&ch[now][1]) //two sons{f[now][0]=max(f[ch[now][0]][2]+f[ch[now][1]][1],f[ch[now][0]][1]+f[ch[now][1]][2]);f[now][1]=max(f[ch[now][0]][2]+f[ch[now][1]][0],f[ch[now][0]][0]+f[ch[now][1]][2]);f[now][2]=max(f[ch[now][0]][0]+f[ch[now][1]][1],f[ch[now][0]][1]+f[ch[now][1]][0])+1;g[now][0]=min(g[ch[now][0]][2]+g[ch[now][1]][1],g[ch[now][0]][1]+g[ch[now][1]][2]);g[now][1]=min(g[ch[now][0]][2]+g[ch[now][1]][0],g[ch[now][0]][0]+g[ch[now][1]][2]);g[now][2]=min(g[ch[now][0]][0]+g[ch[now][1]][1],g[ch[now][0]][1]+g[ch[now][1]][0])+1;}else if (ch[now][0]){f[now][0]=max(f[ch[now][0]][2],f[ch[now][0]][1]);f[now][1]=max(f[ch[now][0]][2],f[ch[now][0]][0]);f[now][2]=max(f[ch[now][0]][0],f[ch[now][0]][1])+1;g[now][0]=min(g[ch[now][0]][2],g[ch[now][0]][1]);g[now][1]=min(g[ch[now][0]][2],g[ch[now][0]][0]);g[now][2]=min(g[ch[now][0]][0],g[ch[now][0]][1])+1;}else{f[now][0]=max(f[ch[now][1]][2],f[ch[now][1]][1]);f[now][1]=max(f[ch[now][2]][2],f[ch[now][1]][0]);f[now][2]=max(f[ch[now][2]][0],f[ch[now][1]][1])+1;g[now][0]=min(g[ch[now][1]][2],g[ch[now][1]][1]);g[now][1]=min(g[ch[now][2]][2],g[ch[now][1]][0]);g[now][2]=min(g[ch[now][2]][0],g[ch[now][1]][1])+1;}
}int main()
{scanf("%s",&s);bh=0;dfs(0); //还原树的形态 doit(1);int f1=max(f[1][0],max(f[1][1],f[1][2]));int f2=min(g[1][0],min(g[1][1],g[1][2]));printf("%d %d",f1,f2);return 0;
}
转载于:https://www.cnblogs.com/wutongtong3117/p/7673461.html
bzoj1864 [Zjoi2006]三色二叉树相关推荐
- 【BZOJ-1864】三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 659 Solved: 469 [Submit][Statu ...
- 1864: [Zjoi2006]三色二叉树
1864: [Zjoi2006]三色二叉树 链接 分析: 做得最智障的一题了... 首先中间输出两个数之间没空格(换行居然也过了...), 写了dp[i][0/1/2],后来知道其实dp[i][0/1 ...
- bzoj 1864: [Zjoi2006]三色二叉树
Description solution 正解:递归+树型DP 我们首先递归建树 然后考虑树型DP,我们设绿色的节点为Y,非绿色为N 我们神奇的发现:N会形成是很多条相互独立的链 也就是说 Y 的下发 ...
- 1864. [ZJOI2006]三色二叉树【树形DP】
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...
- 洛谷P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...
- 洛谷P2585[ZJOI2006]三色二叉树(树形DP)
思路 树形DP,首先是递归建树,然后是DP状态方程转移. 代码 #include<cstdio> #include<cstring> #include<algorithm ...
- BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...
- 2017.9.24 三色二叉树 思考记录
树形dp入门题,,,,枚举转移即可. 设f[i][0]表示这个点不是绿色 f[i][1]表示这个点是绿色. 由于要求是相邻和两儿子,所以枚举下面点的情况转移就可以了 码: #include<io ...
- 【格局视野】三色需求与工作层次
三色需求 人们的社会经济生活本身就是一个互相交换,价值传递的循环,但这个循环有一个核心,这个核心就是社会大众的需求,也可以称为市场需求,围绕这个需求产生了层级递进的需求关系. 第一个层次是蓝色需求 是 ...
最新文章
- python 抛出异常raise
- SQLite | Python3导入csv到SQLite3
- windows创建定时任务执行python脚本
- 不能在构造函数中接收通过QueryString传递的数值
- 语音识别发展必牺牲隐私?最大问题或因不符用户预期,需增透明性
- 创建Qt对话框一般步骤
- 攻防世界Reverse第二题insanity
- JSONObject toJSONString错误
- 重庆邮电大学计算机学院院徽,Slide计算机学院-重庆邮电大学.PPT
- Windows远程桌面(mstsc) 无法全屏显示的解决方法
- c语言状态机实现坐标切换,C语言状态机最优模式(转)
- 编程实现路由算法_TCP/IP 之路由算法
- C/C++算法竞赛代码框架
- mediacodec 相关问题
- CSS中常见中文字体的英文名称
- jersey文件服务器,通过jersey实现客户端图片上传
- windows10获取超级管理员权限
- 打官司除了找律师,还能找谁?
- 日历控件(bootstrap-datetimepicker.js)
- signature=1e204f749b869312ed61b58560de4b88,Walter F. Wright's Art and Substance in George Meredith
热门文章
- 国内云市场,腾讯云、阿里云、华为云,谁能更胜一筹呢?
- 360极速浏览器存放插件文件在电脑中位置路径
- 公有云、私有云、私有化_私有云的未来是什么?
- Android关于Activity屏蔽/拦截Home键
- 以太网交换机和路由器的区别(转载)
- 不可重复读,虚读和脏读的区别
- Rational Team Concert 2
- 关于iis中域名转向的问题
- python解决Unicode编码问题比如\xE6\x9F\xB3\xE4\xBA\x91
- 如何加密保护PPT防止录屏和盗版?用iSpring suite PPT转HTML在线本地安全播放