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]三色二叉树相关推荐

  1. 【BZOJ-1864】三色二叉树 树形DP

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 659  Solved: 469 [Submit][Statu ...

  2. 1864: [Zjoi2006]三色二叉树

    1864: [Zjoi2006]三色二叉树 链接 分析: 做得最智障的一题了... 首先中间输出两个数之间没空格(换行居然也过了...), 写了dp[i][0/1/2],后来知道其实dp[i][0/1 ...

  3. bzoj 1864: [Zjoi2006]三色二叉树

    Description solution 正解:递归+树型DP 我们首先递归建树 然后考虑树型DP,我们设绿色的节点为Y,非绿色为N 我们神奇的发现:N会形成是很多条相互独立的链 也就是说 Y 的下发 ...

  4. 1864. [ZJOI2006]三色二叉树【树形DP】

    Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...

  5. 洛谷P2585 [ZJOI2006]三色二叉树

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

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

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

  7. 洛谷P2585[ZJOI2006]三色二叉树(树形DP)

    思路 树形DP,首先是递归建树,然后是DP状态方程转移. 代码 #include<cstdio> #include<cstring> #include<algorithm ...

  8. BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)

    Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...

  9. 2017.9.24 三色二叉树 思考记录

    树形dp入门题,,,,枚举转移即可. 设f[i][0]表示这个点不是绿色 f[i][1]表示这个点是绿色. 由于要求是相邻和两儿子,所以枚举下面点的情况转移就可以了 码: #include<io ...

  10. 【格局视野】三色需求与工作层次

    三色需求 人们的社会经济生活本身就是一个互相交换,价值传递的循环,但这个循环有一个核心,这个核心就是社会大众的需求,也可以称为市场需求,围绕这个需求产生了层级递进的需求关系. 第一个层次是蓝色需求 是 ...

最新文章

  1. python 抛出异常raise
  2. SQLite | Python3导入csv到SQLite3
  3. windows创建定时任务执行python脚本
  4. 不能在构造函数中接收通过QueryString传递的数值
  5. 语音识别发展必牺牲隐私?最大问题或因不符用户预期,需增透明性
  6. 创建Qt对话框一般步骤
  7. 攻防世界Reverse第二题insanity
  8. JSONObject toJSONString错误
  9. 重庆邮电大学计算机学院院徽,Slide计算机学院-重庆邮电大学.PPT
  10. Windows远程桌面(mstsc) 无法全屏显示的解决方法
  11. c语言状态机实现坐标切换,C语言状态机最优模式(转)
  12. 编程实现路由算法_TCP/IP 之路由算法
  13. C/C++算法竞赛代码框架
  14. mediacodec 相关问题
  15. CSS中常见中文字体的英文名称
  16. jersey文件服务器,通过jersey实现客户端图片上传
  17. windows10获取超级管理员权限
  18. 打官司除了找律师,还能找谁?
  19. 日历控件(bootstrap-datetimepicker.js)
  20. signature=1e204f749b869312ed61b58560de4b88,Walter F. Wright's Art and Substance in George Meredith

热门文章

  1. 国内云市场,腾讯云、阿里云、华为云,谁能更胜一筹呢?
  2. 360极速浏览器存放插件文件在电脑中位置路径
  3. 公有云、私有云、私有化_私有云的未来是什么?
  4. Android关于Activity屏蔽/拦截Home键
  5. 以太网交换机和路由器的区别(转载)
  6. 不可重复读,虚读和脏读的区别
  7. Rational Team Concert 2
  8. 关于iis中域名转向的问题
  9. python解决Unicode编码问题比如\xE6\x9F\xB3\xE4\xBA\x91
  10. 如何加密保护PPT防止录屏和盗版?用iSpring suite PPT转HTML在线本地安全播放