思路

树形DP,首先是递归建树,然后是DP状态方程转移。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include <cmath>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 500005
using namespace std;
struct Edge{int v, next;
}edge[maxn];
int head[maxn], vis[maxn], cnt, n, m;
int dpmx[maxn][2], dpmi[maxn][2];
int nows = 0, nownode = 1;
char s[maxn];
void add_edge(int u, int v){edge[cnt].v = v;edge[cnt].next = head[u];head[u] = cnt++;
}
void build(int x){++nows;if(s[nows]=='1'){add_edge(x, ++nownode);build(nownode);} else if(s[nows]=='0') return;else{add_edge(x,++nownode);build(nownode);add_edge(x,++nownode);build(nownode);}
}void dfs(int u){int du = 0;int son1=0,son2=0;for(int i = head[u]; i!=-1; i=edge[i].next){int v = edge[i].v;dfs(v);du++;if(!son1) son1 = v;else son2 = v;}if(!du){dpmx[u][0] = 0;dpmx[u][1] = 1;dpmi[u][0] = 0;dpmi[u][1] = 1;}if(du==1){dpmx[u][0] = max(dpmx[son1][0],dpmx[son1][1]);dpmx[u][1] = dpmx[son1][0]+1;dpmi[u][1] = dpmi[son1][0]+1;dpmi[u][0] = min(dpmi[son1][0],dpmi[son1][1]);}if(du==2){dpmx[u][0] = max(dpmx[son1][1]+dpmx[son2][0],dpmx[son2][1]+dpmx[son1][0]);dpmx[u][1] = dpmx[son1][0]+dpmx[son2][0]+1;dpmi[u][1] = dpmi[son1][0]+dpmi[son2][0]+1;dpmi[u][0] = min(dpmi[son1][1]+dpmi[son2][0],dpmi[son2][1]+dpmi[son1][0]);}
}void init(){memset(dpmx, -inf, sizeof(dpmx));memset(dpmi, 0x3f, sizeof(dpmi));cnt = 0;memset(head, -1, sizeof(head));
}int main(){int i, j, k;init();scanf("%s",s+1);build(1);dfs(1);printf("%d ",max(dpmx[1][0],dpmx[1][1]));printf("%d\n",min(dpmi[1][0],dpmi[1][1]));
}

洛谷P2585[ZJOI2006]三色二叉树(树形DP)相关推荐

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

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

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

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

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

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

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

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

  5. [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)

    [洛谷 P4084 USACO17DEC] Barn Painting G 题目链接 大致题意: 给定一颗N个节点组成的树,3种颜色,其中K个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数 ...

  6. 【洛谷P4084】Barn Painting【树形DP】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P4084 一棵nnn个节点的树上有kkk个点已被染色.求将这棵树染成三种颜色且相邻的节点颜色不同的方 ...

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

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

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

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

  9. 洛谷 P1352 没有上司的舞会(树形 DP)

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

最新文章

  1. 泛型委托在项目中的应用
  2. 复原所有面板设置+剪切板
  3. HDU4394(数论中的广搜)
  4. 分布式事务、cloud、boot、常规队列MQ、elk、kafuka
  5. 黑马-程序员C#泛型简介
  6. 如何编译 dotnet/aspnetcore 源代码
  7. 【EMV L2】数据元格式 对齐方式
  8. Java selenium 读取网页
  9. 剑指offer面试题12. 矩阵中的路径(矩阵搜索)(深度优先搜索)(剪枝)
  10. android学习心得之Activity
  11. 基于16QAM调制的OFDM系统仿真实现(MATLAB)
  12. 数据结构之求二叉树叶子结点个数
  13. 谷歌浏览器http请求之curl使用
  14. 用c#语言制作点歌程序,c#实现KTV点歌系统
  15. MongoDB的局域网连接问题
  16. 统计学中位数概念的理解
  17. CertPathValidatorException:validity check failed
  18. 共享手机 馅饼还是陷阱
  19. 被“淘宝”的章文嵩西邮之行
  20. Educational Codeforces Round 49 (Rated for Div. 2)切题报告

热门文章

  1. 自学一周python做的一个小游戏《大球吃小球》
  2. 使用标准的接口和API导入料号
  3. GhostNets on Heterogeneous Devices via Cheap Operations
  4. Linux 学习网站汇总
  5. 小型企业的网络拓扑结构设计
  6. 微量齿轮泵mzr-7245和mzr-4622在全自动密度测定中的应用
  7. 索引,主键,唯一索引,联合索引的区别
  8. 何先振第1期:Java编程入门计算机介绍
  9. 语音交互设计探究——以车载场景为例
  10. Oracle如何用单字段或多字段进行查重