BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)
Description
Input
仅有一行,不超过500000个字符,表示一个二叉树序列。
Output
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
Sample Input
Sample Output
HINT
Source
Day1
题解
这道题我们考虑dp
我们先把树给构造出来(可以用栈,也可以用dfs)
建完树后,我们用f[i][0/1/2][0]表示i节点填绿/蓝/红色的最小答案,f[i][0/1/2][1]表示i节点填绿/蓝/红色的最大答案
我们考虑i节点从两个儿子转移
f[i][0][0]=min(f[s1][1][0]+f[s2][2][0],f[s1][2][0]+f[s2][1][0])
f[i][1][0]=min(f[s1][0][0]+f[s2][2][0],f[s1][2][0]+f[s2][0][0])
f[i][2][0]=min(f[s1][0][0]+f[s2][1][0],f[s1][1][0]+f[s2][0][0])
f[i][0/1/2][1]转移同理
1 #include<bits/stdc++.h> 2 #define N 500005 3 using namespace std; 4 int tot,top; 5 int Stack[N]; 6 int f[N][3][2]; 7 char s[N]; 8 int main(){ 9 scanf("%s",s+1); 10 int len=strlen(s+1); 11 for (int i=len;i>=1;i--) 12 if (s[i]=='2'){ 13 int x=Stack[top],y=Stack[--top]; 14 tot++; 15 f[tot][0][0]=min(f[x][1][0]+f[y][2][0],f[x][2][0]+f[y][1][0])+1; 16 f[tot][1][0]=min(f[x][2][0]+f[y][0][0],f[x][0][0]+f[y][2][0]); 17 f[tot][2][0]=min(f[x][1][0]+f[y][0][0],f[x][0][0]+f[y][1][0]); 18 f[tot][0][1]=max(f[x][1][1]+f[y][2][1],f[x][2][1]+f[y][1][1])+1; 19 f[tot][1][1]=max(f[x][2][1]+f[y][0][1],f[x][0][1]+f[y][2][1]); 20 f[tot][2][1]=max(f[x][1][1]+f[y][0][1],f[x][0][1]+f[y][1][1]); 21 Stack[top]=tot; 22 } else 23 if (s[i]=='1'){ 24 int x=Stack[top]; 25 tot++; 26 f[tot][0][0]=min(f[x][1][0],f[x][2][0])+1; 27 f[tot][1][0]=min(f[x][0][0],f[x][2][0]); 28 f[tot][2][0]=min(f[x][0][0],f[x][1][0]); 29 f[tot][0][1]=max(f[x][1][1],f[x][2][1])+1; 30 f[tot][1][1]=max(f[x][0][1],f[x][2][1]); 31 f[tot][2][1]=max(f[x][0][1],f[x][1][1]); 32 Stack[top]=tot; 33 } else{ 34 tot++; 35 f[tot][0][0]=f[tot][0][1]=1; 36 Stack[++top]=tot; 37 } 38 int Max=max(f[tot][0][1],max(f[tot][1][1],f[tot][2][1])); 39 int Min=min(f[tot][0][0],min(f[tot][1][0],f[tot][2][0])); 40 printf("%d %d",Max,Min); 41 return 0; 42 }
View Code
转载于:https://www.cnblogs.com/zhuchenrui/p/7794835.html
BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)相关推荐
- bzoj 1864: [Zjoi2006]三色二叉树
Description solution 正解:递归+树型DP 我们首先递归建树 然后考虑树型DP,我们设绿色的节点为Y,非绿色为N 我们神奇的发现:N会形成是很多条相互独立的链 也就是说 Y 的下发 ...
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...
- 【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 ...
- 1864. [ZJOI2006]三色二叉树【树形DP】
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...
- 洛谷P2585[ZJOI2006]三色二叉树(树形DP)
思路 树形DP,首先是递归建树,然后是DP状态方程转移. 代码 #include<cstdio> #include<cstring> #include<algorithm ...
- 洛谷P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...
- BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...
- 【bzoj 1812】[Ioi2005]riv(树形dp)
1812: [Ioi2005]riv Time Limit: 10 Sec Memory Limit: 64 MB Submit: 433 Solved: 246 [Submit][Status] ...
- bzoj 3162: 独钓寒江雪 树哈希+树形dp
题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...
最新文章
- 「x is All You Need」,当学术论文开始标题党……
- [YTU]_2432( C++习题 对象数组输入与输出)
- phalcon:跟踪sql语句
- ios 调用c语言函数指针,第09天C语言(08):指向函数的指针的应用场景
- 天融信防火墙NGFW4000配置
- 回归专题 | regression
- Open XML操作Excel导入数据
- AIDA64自动监控计算机硬件工作情况
- 使用Sphinx对MySQL数据库进行全文检索
- 【整理】3dsMax中毒了怎么办
- c语言vs2013下载官方下载,Microsoft Visual C++2013运行库下载
- Android studio真机运行失败,提示“软件包似乎无效” “应用程序安装异常(-15)”
- golang中net/http包用法
- 刚刚!国产大数据基础软件第一股星环科技成功上市,开盘大涨超52%
- 天猫淘宝卡券包演进史
- html 整体边距,html内容左右边距怎么设置
- 【redis】二、redis数据类型
- Maven 是什么东西?
- 在前端页面生成二维码并下载(兼容IE)
- 校内练习 华山论剑 [最短路]