洛谷P2585[ZJOI2006]三色二叉树(树形DP)
思路
树形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)相关推荐
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...
- 洛谷P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...
- 【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 ...
- [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)
[洛谷 P4084 USACO17DEC] Barn Painting G 题目链接 大致题意: 给定一颗N个节点组成的树,3种颜色,其中K个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数 ...
- 【洛谷P4084】Barn Painting【树形DP】
题目大意: 题目链接:https://www.luogu.org/problemnew/show/P4084 一棵nnn个节点的树上有kkk个点已被染色.求将这棵树染成三种颜色且相邻的节点颜色不同的方 ...
- 1864. [ZJOI2006]三色二叉树【树形DP】
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...
- bzoj 1864: [Zjoi2006]三色二叉树
Description solution 正解:递归+树型DP 我们首先递归建树 然后考虑树型DP,我们设绿色的节点为Y,非绿色为N 我们神奇的发现:N会形成是很多条相互独立的链 也就是说 Y 的下发 ...
- 洛谷 P1352 没有上司的舞会(树形 DP)
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
最新文章
- 泛型委托在项目中的应用
- 复原所有面板设置+剪切板
- HDU4394(数论中的广搜)
- 分布式事务、cloud、boot、常规队列MQ、elk、kafuka
- 黑马-程序员C#泛型简介
- 如何编译 dotnet/aspnetcore 源代码
- 【EMV L2】数据元格式 对齐方式
- Java selenium 读取网页
- 剑指offer面试题12. 矩阵中的路径(矩阵搜索)(深度优先搜索)(剪枝)
- android学习心得之Activity
- 基于16QAM调制的OFDM系统仿真实现(MATLAB)
- 数据结构之求二叉树叶子结点个数
- 谷歌浏览器http请求之curl使用
- 用c#语言制作点歌程序,c#实现KTV点歌系统
- MongoDB的局域网连接问题
- 统计学中位数概念的理解
- CertPathValidatorException:validity check failed
- 共享手机 馅饼还是陷阱
- 被“淘宝”的章文嵩西邮之行
- Educational Codeforces Round 49 (Rated for Div. 2)切题报告