树形dp系列
1.火车站开饭店
最大独立集裸题
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #define N 200000+20 using namespace std; ]; ; void link(int x,int y){ nxt[++tot]=head[x]; to[tot]=y; head[x]=tot; } void dfs(int x,int fa){ dp[x][]=a[x];//0为在独立集里 dp[x][]=;//1为不在 for (int i=head[x];i;i=nxt[i]){ if (to[i]==fa) continue; dfs(to[i],x); dp[x][]+=dp[to[i]][]; dp[x][]+=max(dp[to[i]][],dp[to[i]][]); } } int main(){ scanf ("%d",&n); ;i<=n;++i) scanf ("%d",&a[i]); int x,y; ;i<n;++i){ scanf ("%d%d",&x,&y); link(x,y),link(y,x); } dfs(,); printf (][],dp[][])); ; }
2.树的最小染色
考题 当时只打了两个状态 居然用我神奇的调试功力搞了10分?
考完之后愣是想了好久才想通 好像是最小支配集
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #define maxn 300000 #define INF 10000100 using namespace std; ,root=,sum,f[maxn][],ans=,g[maxn],sz[maxn]; void link(int x,int y) { nxt[++tot]=head[x]; to[tot]=y; head[x]=tot; } void dfs(int x) { if (!sz[x])//0 靠爸爸 1 靠儿子 2 靠自己 { f[x][]=,f[x][]=INF>>,f[x][]=v[x]; return ; } ,fl=; for (int i=head[x];i;i=nxt[i]) { int t=to[i]; dfs(t); f[x][]+=min(f[t][],min(f[t][],f[t][])); f[x][]+=f[t][]; ]>=f[t][]) fl=,s2+=f[t][]; ],s1=min(s1,f[t][]-f[t][]); } f[x][]+=v[x]; f[x][]=s2; ]+=s1; } int main() { int n; scanf ("%d",&n); ;i<=n;++i) { int x,y,z,k; scanf ("%d%d%d",&x,&y,&z); v[x]=y,sz[x]=z; ;j<=z;++j) { scanf ("%d",&k); link(x,k); g[k]=; } } ;i<=n;++i) if (!g[i]) root=i; dfs(root); cout<<min(f[root][],f[root][]); ; }
3.POJ 3659 Cell Phone Network
最小支配集 模板题 另外我发现我真的很喜欢打靠爸爸靠儿子还是靠自己之类的话23333
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #define ll long long #define db double #define N 20000 #define inf 1000000000 using namespace std; ]; ; void link(int x,int y){ nxt[++tot]=head[x]; to[tot]=y; head[x]=tot; } void dfs(int x,int fa){ dp[x][]=,dp[x][]=,dp[x][]=;//0属于 1靠儿子 2靠父亲 ,q=inf; for (int i=head[x];i;i=nxt[i]){ int t=to[i]; if (t==fa) continue; dfs(t,x); dp[x][]+=min(dp[t][],min(dp[t][],dp[t][])); ]!=inf&&dp[x][]!=inf) dp[x][]+=dp[t][]; ]=inf; ]>=dp[t][]) dp[x][]+=dp[t][],fl=t; ]+=dp[t][]; q=min(q,dp[t][]-dp[t][]); } ]+=q; ]) dp[x][]=inf; } int main(){ int n; scanf ("%d",&n); int x,y; ;i<n;++i){ scanf ("%d%d",&x,&y); link(x,y),link(y,x); } dfs(,); printf (][],dp[][])); ; }
4.POJ 2152 消防站
神题啊qwq 怎么推的出(瘫
围观了一下dalao的论文感觉很有道理又觉得不是很明白
后来翻到:http://blog.csdn.net/loi_dqs/article/details/50878337 在吸取了论文部分内容的基础上很快就明白了
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #include<queue> #include<vector> #define ll long long #define db double #define N 5000 using namespace std; ; int w[N],d[N],k[N],de[N][N],ans[N],f[N][N]; struct hh{ int to,nxt,w; }b[N]; int head[N]; void link(int x,int y,int w){ b[++tot].nxt=head[x]; b[tot].to=y; b[tot].w=w; head[x]=tot; } void dis(int x,int y,int fa,int di){ de[x][y]=min(de[x][y],di); for (int i=head[y];i;i=b[i].nxt){ int v=b[i].to; if (v==fa) continue; dis(x,v,y,di+b[i].w); } } void dp(int x,int fa){ for (int i=head[x];i;i=b[i].nxt){ int t=b[i].to; if (t==fa) continue; dp(t,x); } ;i<=n;++i){ if (de[x][i]>d[x]) continue; f[x][i]=w[i]; for (int j=head[x];j;j=b[j].nxt){ int k=b[j].to; if (k==fa) continue; f[x][i]+=min(f[k][i]-w[i],ans[k]); } ans[x]=min(ans[x],f[x][i]); } } int main(){ scanf ("%d",&n); ;i<=n;++i) scanf ("%d",&w[i]); ;i<=n;++i) scanf ("%d",&d[i]); int x,y,z; ;i<n;++i){ scanf ("%d%d%d",&x,&y,&z); link(x,y,z);link(y,x,z); } memset(f,0x3f,sizeof(f)); memset(de,0x3f,sizeof(de)); memset(ans,0x3f,sizeof(ans)); ;i<=n;++i) dis(i,i,,); dp(,); printf (]); ; }
UPD 2017_07_12
连考两天树形dp我都在鬼混 感觉很不好意思TAT(之前可能是白学了)(那个白学 不是那个白学)
发现了一点小套路?
感觉这一类题经常可以用两个dp的数组分别搞然后分情况转移合并 这样思路比较简单
也可以设三个左右状态互相转移 实现起来会更清爽qwq
然后好像经常设的都是N×M之类的 一般要数据范围别太大才能玩吧
状态大多跟父节点 子节点 子树的个数 在不在某状态中 一类有关qwq
还需多多领悟啊= =
树形dp系列的更多相关文章
- HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]
题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 ...
- 【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)
总述 这类题目都是求一个最长路径,这个路径可以不经过根节点. 使用dfs(即递归地遍历树)的方法.维护一个全局最长路径max作为最终结果,而递归方法dfs返回的是含根节点的最长路径.(若不使用全局变量 ...
- 【BZOJ-1864】三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 659 Solved: 469[Submit][Status] ...
- 代码风格与树形DP
Streaming很惨,不过因为比赛之间没有提交过就没掉(或掉了)rating.第二题是一个树形DP,但是我都在想第一题了,简直作死. 看着神犇的代码我也是醉了...各种宏,真是好好写会死系列. 看到 ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- 树形DP——动态规划与数据结构的结合,在树上做DP
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...
随机推荐
- Spring框架——AOP代理
我们知道AOP代理指的就是设计模式中的代理模式.一种是静态代理,高效,但是代码量偏大:另一种就是动态代理,动态代理又分为SDK下的动态代理,还有CGLIB的动态代理.Spring AOP说是实现了AO ...
- Oracle的窗口和自动任务
Oracle数据库自己会例行做一些定时任务,比如会自动进行统计信息收集等作业任务.如果统计信息收集的时间正好赶上业务的高峰期,那就有可能由此引发一系列性能故障. 那么,我们该如何查看这些数据库自动去做 ...
- 关于String中的不变模式
不变模式 不变模式就是为了尽可能的去除并行中的同步操作,提高并行程序的性能,可以使用一种不可改变的对象,依靠对象的不变性,可以确保其在没有同步操作的多线程环境中依然始终保持内部状态的一致性和正确性.并 ...
- Javascript-数值运算 保留小数点位数,并对最后一位小数各种取整方法
今天遇到Javascript数值运算的坑,说到底,还是用得少啊.得多用多敲代码多遇坑. 先介绍以下三个Javascript number取整运算方法. Math.floor() 对一个数退一取整 例: ...
- mysql--二进制日志(bin-log)三种格式介绍及分析
一.Mysql binlog日志有三种格式,分别为ROW.Statement以及MiXED.Row LevelBinary Log会记录成[每一行数据被修改的形式],然后在Slave端再对相同的数据进 ...
- Python 冒泡法排序
def sequence(disorder='', separators=''): arrays = disorder.split(separators) def desc(): for i in r ...
- FreeRTOS--疑难解答
此章节涉及新手最常遇见的3种问题: 错误的中断优先级设置 栈溢出 不恰当的使用printf() 使用configASSERT()能够显著地提高生产效率,它能够捕获.识别多种类型的错误.强烈建议在开发或 ...
- 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络Vgg
上周我们讲了经典CNN网络AlexNet对图像分类的效果,2014年,在AlexNet出来的两年后,牛津大学提出了Vgg网络,并在ILSVRC 2014中的classification项目的比赛中取得 ...
- jquery写的树状列表插件-alvintree
在做项目的时候遇到选择部门下人员的功能,可多选可单选,所以就想着使用树状列表来进行选择,但在网上找了很多,发现要么就是挺复杂,要么就是需要各种前端框架的支持,试了一个感觉难用,所以就想着自己写一个简便 ...
- java多线程核心技术——第四章总结
第一节使用ReentrantLock类 1.1使用ReentrantLock实现同步:测试1 1.2使用ReentrantLock实现同步:测试2 1.3使用Condition实现等待/同步错误用法与 ...