
动态规划之树形dp
code_mryxj
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poj1985Cow Marathon (树的最长路径)
题意:求树上权值最大的一条道路。 思路:树上最长路径的裸体,常见做法两种。 1.树形dp : d(i):表示根为节点i的子树中根到叶子的最大距离。d(i)=max( dp[j])+1. j为i亲儿子。 把所有子结点 的d(j)求出来后,设d值前两个最大的是u,v,则d(u)+d(v)+2就是所求。2.随便找一个结点u,用dfs或bfs求离它最远的点v,然后以v为起点,再用一次dfs或bfs求出原创 2016-10-12 23:47:00 · 863 阅读 · 0 评论 -
hdu5927 2016 东北赛F Auliary Set
题意:在一颗1为根的树上,又很少一部分的不重要的点,其他都是重要的点,问满足条件的点有多少个? 满足条件有两种情形:1.为重要的点。2.他的亲孩子至少有两个不同的重要的点。 思路:先预处理每个点的孩子个数,和父亲是谁。在对于比较少的m个不重要点,求是否满足有两个不同的重要点孩子。这个求法是O(m)。 怎么做呢?对m个点深度排序,从最深的点开始,满足孩子数>=2就计数,不满足就把他父亲的孩子数-原创 2016-09-26 10:32:49 · 550 阅读 · 0 评论 -
HDU3586 Information Disturbing(二分+树形dp)
题意:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线。现要切断前线和司令部的联系,每次切断边的费用不能超过上限limit,问切断所有前线与司令部联系所花费的总费用少于m时的最小limit。1思路:最小的Limit,这样的问法,明显需要二分。我们二分一个limit,在树上 对于每个点我们考虑把他和他子节点边切掉或则切掉原创 2016-10-20 13:27:04 · 426 阅读 · 0 评论 -
Uva1218 Perfect Services
题意: 给出一个树形的计算机网络,选取其中给一部分作为服务器,要求非服务器的计算机,相邻有且只有一个服务器,问最少选择几个服务器。 思路: 这题不看书,我感觉我目前是做不出来的….又回到看题解过题时代…..Orz 一共有三种状态: 1、d[u][0]:u是服务器,每个子结点可以是也可以不是。 2、d[u][1]:u不是服务器,但u的父亲是,u的子结点都不是服务器。 3、d[u][2]:u原创 2016-10-07 17:50:19 · 318 阅读 · 0 评论 -
HDU 4003Find Metal Mineral
题意: 给你一颗N个节点的树,和K个机器人从S点出发,问走遍所有点的最小路程是?机器人可以走回头路。思路:这题情形是:如果树某一个节点的分支数>k,那么必然会有从根节点派往子节点并且折回到根节点,就是会走重复的边,就像第一个案例。设 dp[i][j] : 表示在i节点有派了j个机器人的最小路程耗费,定义DP[i][0]存放1个机器人,从子节点返回到根节点的花费。思考,(1)如果只有原创 2016-10-19 19:00:11 · 422 阅读 · 0 评论 -
hdu4607 (求树的直径)
题意:给你一颗n个节点的无根树,m次询问,问经过k个点的最少路程,树上每条边默认权值为1. 思路:先求出树上最长路的长度ans,然后思考一下找规律发现,满足k<=ans, 结果就是 k-1,否则结果就是(k-ans)*2+ans-1。#include<bits/stdc++.h>using namespace std;template<int N,int M>//N点的个数,M边的个数stru原创 2016-10-15 16:20:55 · 401 阅读 · 0 评论 -
Codeforces Round #362 (Div. 2)(A~D))
目前水平有限,补了四题。。。 感觉这场质量很高,没有白补。 A. Pineapple Incident 题意&思路:水题#include<bits/stdc++.h>using namespace std;int main(){ int t,s,x; while(cin>>t>>s>>x){ if(x==t||(x-t)%s==0&&x>t||(x-t-1)%s=原创 2016-10-06 20:59:20 · 305 阅读 · 0 评论 -
poj1155 TELE(树形+背包dp)
题意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端,其余点为转发站。客户端i愿支付的钱为pay[i],每一条边需要的花费固定,问电台在保证不亏损的情况下,最多能使多少个客户端接收到信息? 思路: 设dp[i][j]:表示i节点为根节点并且子树已经有j个用户的时候最大剩余费用。 那么人人为我的转移方程式的写法就是: dp[i][j]=max(dp[i][j-k]原创 2016-10-18 19:59:00 · 350 阅读 · 0 评论 -
poj 3107 Godfather(树的重心问题)
题意:在一棵有向树上求树的重心。 思路: 首先树的重心的定义:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 之前做过一道cf div2 C 得到一个结论,某个点的所有子树大小都小于等于这个棵树总数一般,那么这个点就是树重心。 所以和poj1655 类似 ,确立树根后(此题默认0为根)一遍dfs,求出那个点去掉后的子树结原创 2016-10-04 18:45:40 · 351 阅读 · 0 评论 -
poj1955 Balancing Act
题意: 就是去掉树上的一个节点,看看剩下的子树中最大的是多少,然后在这些最大值中求一个最小值,如果有多个点都是最小值,输出序号最小的。 思路:一遍dfs ,保存求出每个点的子树里最大的节点个数。#include<cstdio>#include<cstring>#include<vector>#include<iostream>using namespace std;const int原创 2016-10-04 18:01:00 · 495 阅读 · 0 评论 -
【DP_树形DP专辑】
转自: http://blog.youkuaiyun.com/woshi250hua/article/details/7644959 树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树、三叉树、静态搜索树、AVL树,线段树、SPLAY树,后缀树等等.. 枚举那么多种数据结构只是想转载 2016-10-04 16:44:47 · 412 阅读 · 0 评论 -
poj1741 Tree (求树上任意两点之间权值和小于k的个数)(树分治)
题意:给你n个节点的树和k,问在这个树上两点之间最近距离小于k的情况有多少种? 思路: 看了两天题解(有些还写错)和一篇关于树分治的论文分治算法在数的路径问题中的应用才知道这是一类我从来没有做过的思想,在树上利用重心分治的搞一下把O(n)的步骤优化到O(logn). 先分析: 假定选择一点1为根,那其他点到根的最短距离就有两种情况。 其一,它们在根的不同分支上,那他们的最近距离就是它们到它原创 2016-10-17 19:05:34 · 3307 阅读 · 2 评论 -
hdu2196(求每一点在树上最远距离)
题意:如标题所示 ,在一棵无根树上求每一点的最远距离,poj1985(求树上直径(最远两点距离))加强版。 思路:考虑一遍dfs从叶子到根的顺序可以先求dp[i][0] 表示以i为根的子树到根的最远距离,随带把次大的距离也求了(当然有用).再思考一下,对于单个点他往子孙方向上最远距离已求出,他的 祖先里到他的最远距离未知,如果他父亲作为根到子孙的最远距离经过它,那么只能就是选择他父亲第二远的距离原创 2016-10-14 20:27:47 · 827 阅读 · 0 评论 -
HDU1520(树形dp入门题)
题意:在一个有根树上每个节点有一个权值,每相邻的父亲和孩子只能选择一个,问怎么选择总权值之和最大。思路: 树形dp的常规入门题:设dp[i][0]表示:当前这个点不选,dp[i][1]表示当前这个点选择的最优解。转移方程:dp[cur][0]+=max(dp[son][1],dp[son][0]);//当前这个点不选,那他的孩子可选可不选,取 最大的。 dp[cur][1]+=dp[son][原创 2016-09-28 21:40:01 · 4120 阅读 · 0 评论 -
HDU 3534 Tree(经典树形dp)
树形dp原创 2016-10-21 00:43:27 · 630 阅读 · 0 评论 -
hdu4714 Tree2cycle
下午心血来潮找来cjx第一次两人训练一套难度很低题目,就差这道思路正确不敢写,现在补一下。 题意:给你一棵树,每次删除一条边和增加一条边费用都是1,问最少的花费把一棵树变成 一条环。 思路:随手画了几个样例,发现不存在最少花费的策略,结果是唯一的。只要dfs序一遍判断每个点度数,大于2就说明需要删除这个点。思路很简单,清晰。 直接交MLE,需要扩栈,C++提交。#pragma commen原创 2017-04-30 21:51:40 · 731 阅读 · 0 评论