Description

Input

仅有一行,不超过500000个字符,表示一个二叉树序列。

Output

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

Sample Input

1122002010

Sample Output

5 2

f[x][1\2\3]代表x点染红绿蓝色的最多有多少个点染成绿色
g[x][1\2\3]代表最少

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define N (1000000+100)
 5 using namespace std;
 6 char st[N];
 7 int Father[N],Son[N][2];
 8 int a[N],maxn;
 9 int f[N][4],g[N][4];
10
11 void Build(int x,int fa)
12 {
13     maxn=max(maxn,x);
14     Father[x]=fa;
15     if (!Son[fa][0]) Son[fa][0]=x;
16     else Son[fa][1]=x;
17     if (a[x]>=1) Build(x+1,x);
18     if (a[x]==2) Build(maxn+1,x);
19 }
20
21 void Dp(int x)
22 {
23     f[x][1]=0;f[x][2]=1;f[x][3]=0;
24     g[x][1]=0;g[x][2]=1;g[x][3]=0;
25     if (Son[x][0]) Dp(Son[x][0]);
26     if (Son[x][1]) Dp(Son[x][1]);
27     f[x][1]+=max( f[Son[x][0]][2]+f[Son[x][1]][3] , f[Son[x][0]][3]+f[Son[x][1]][2] );
28     f[x][2]+=max( f[Son[x][0]][1]+f[Son[x][1]][3] , f[Son[x][0]][3]+f[Son[x][1]][1] );
29     f[x][3]+=max( f[Son[x][0]][1]+f[Son[x][1]][2] , f[Son[x][0]][2]+f[Son[x][1]][1] );
30
31     g[x][1]+=min( g[Son[x][0]][2]+g[Son[x][1]][3] , g[Son[x][0]][3]+g[Son[x][1]][2] );
32     g[x][2]+=min( g[Son[x][0]][1]+g[Son[x][1]][3] , g[Son[x][0]][3]+g[Son[x][1]][1] );
33     g[x][3]+=min( g[Son[x][0]][1]+g[Son[x][1]][2] , g[Son[x][0]][2]+g[Son[x][1]][1] );
34 }
35
36 int main()
37 {
38     scanf("%s",st);
39     for (int i=0;i<=strlen(st)-1;++i)
40         a[i+1]=st[i]-'0';
41     Build(1,0);
42     Son[0][0]=Son[0][1]=0;
43     Dp(1);
44     printf("%d ",max(max(f[1][1],f[1][2]),f[1][3]));
45     printf("%d",min(min(g[1][1],g[1][2]),g[1][3]));
46 }

转载于:https://www.cnblogs.com/refun/p/8680805.html

1864. [ZJOI2006]三色二叉树【树形DP】相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 算法设计与分析 树形dp

    树形dp 概述 题目一:二叉树节点间的最大距离问题 题目二:排队最大快乐值(多叉树问题) 题目三:判断是否为满二叉树 题目四:判断是否为平衡二叉树 题目五:判断是否为二叉排序树 概述 使用前提:如果题 ...

最新文章

  1. 嵌入式开发板设置无密码登录
  2. awstats CGI模式下动态生成页面缓慢的改进
  3. Linux中重定向--转载
  4. 15条最重要且最基本的SEO优化Tips和技巧
  5. SpringBoot中实现CommandLineRunner接口在项目启动后立即执行某方法
  6. Vscode html代码快速填写
  7. Unobtrusive Ajax
  8. sun cluster3.1
  9. 饼图大小调整_Excel图表变形计:个性化的创意饼图,原来可以很快做出来!
  10. oracle 数据库查询多条数据的一列值
  11. 看我如何基于PythonFacepp打造智能监控系统
  12. NOI2011 智能车比赛
  13. 光栅衍射主极大个数_基于达曼光栅的双目视觉系统
  14. Unity3D基础22:GUI Texture组件/Sence下显示图片
  15. 25本《Python+TensorFlow机器学习实战》免费包邮到家!
  16. 解决cv2.error: OpenCV(xxx) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp问题
  17. BZOJ 3238 【AHOI2013】 差异
  18. Java 导出word和pdf_Java实现word导出与pdf导出
  19. 论文格式修改之英文摘要
  20. 【集合论】关系表示 ( 关系矩阵 | 关系矩阵示例 | 关系矩阵性质 | 关系矩阵运算 | 关系图 | 关系图示例 | 关系表示相关性质 )

热门文章

  1. 008_使用pyenv进行py开发环境管理
  2. Recovery 流程简介
  3. fatal error LNK1120: 11 unresolved externals
  4. Java虚拟机运行时数据区
  5. 《OD大数据实战》MapReduce实战
  6. 更改vs2010帮助文档的位置
  7. div隐藏select显示的解决办法(就死select挡住了div) 不是网上找到的那五种
  8. react新生命周期
  9. Maven查看插件信息
  10. Intellij idea利用Statistic插件统计项目代码行数