『大 树形dp』
<更新提示>
<第一次更新>
<正文>
大
Description
滑稽树上滑稽果,滑稽树下你和我,滑稽树前做游戏,滑稽多又多。树上有 n 个节点,它们构成了一棵树,每个节点都有一个滑稽值。
一个大的连通块是指其中最大滑稽值和最小滑稽值之差不超过d。
每次你可以选择一个大的连通块并把它们删掉,请问你最少能用几次把这些节点都删掉呢?
Input Format
第一行两个整数 d 和 n。
第二行 n 个整数,分别表示每个节点的滑稽值。
接下来 n-1 行每行两个整数表示一条边。
Output Format
一行一个整数表示答案。
Sample Input
3 5
1 2 3 4 5
1 2
1 3
3 4
3 5
Sample Output
2
解析
一道思维题。
一看上去就很像树形\(dp\),不过限制好像很难维护。但是我们可以换一个方向考虑,我们把一个点权为\(a[x]\)的节点看做一个区间\([a[x],a[x]+d]\),那么一次合法的联通块删除操作必然满足至少有一个公共点被连通块内的所有区间覆盖。
想到这个就可以\(dp\)了,设\(g[x]\)代表删除子树\(x\)的最小代价,\(f[x][v]\)代表以\(x\)为根的子树中还存在一个未结算删除代价的连通块,其公共点为\(v\)的最小代价和。状态转移方程:
\]
第一个方程的含义就是要么直接删除一棵子树,要么连接到当前点的连通块里,待会一起删除。第二个方程的含义就是找一个公共点,然后在节点\(x\)处把未结算的代价结算掉,删除连通块。
\(Code:\)
#include <bits/stdc++.h>
using namespace std;
const int N = 5020;
struct edge { int ver,next; } e[N*2];
int n,d,t,Head[N],a[N],f[N][N],g[N];
inline void insert(int x,int y) { e[++t] = (edge){y,Head[x]} , Head[x] = t; }
inline void input(void)
{
scanf("%d%d",&d,&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
insert( x , y );
insert( y , x );
}
}
inline void dp(int x,int fa)
{
for (int i=a[x];i<=min(a[x]+d,5000);i++)
f[x][i] = 0;
for (int i=Head[x];i;i=e[i].next)
{
int y = e[i].ver;
if ( y == fa ) continue;
dp( y , x );
for (int j=a[x];j<=min(a[x]+d,5000);j++)
f[x][j] += min( f[y][j] , g[y] );
}
for (int i=a[x];i<=min(a[x]+d,5000);i++)
g[x] = min( g[x] , f[x][i] + 1 );
}
int main(void)
{
input();
memset( f , 0x3f , sizeof f );
memset( g , 0x3f , sizeof g );
dp( 1 , 0 );
printf("%d\n",g[1]);
return 0;
}
<后记>
『大 树形dp』的更多相关文章
- 『kamp 树形dp』
kamp Description jz 市的云台山是个很美丽的景区,小 x 暑期到云台山打工,他的任务是开景区的大巴. 云台山景区有 N 个景点,这 N 个景点由 N-1 条道路连接而成,我们保证这 ...
- 『选课 树形dp 输出方案』
这道题的树上分组背包的做法已经在『选课 有树形依赖的背包问题』中讲过了,本篇博客中主要讲解将多叉树转二叉树的做法,以便输出方案. 选课 Description 学校实行学分制.每门的必修课都有固定的学 ...
- 『You Are Given a Tree 整体分治 树形dp』
You Are Given a Tree Description A tree is an undirected graph with exactly one simple path between ...
- 『战略游戏 最大利润 树形DP』
通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...
- 『没有上司的舞会 树形DP』
树形DP入门 有些时候,我们需要在树形结构上进行动态规划来求解最优解. 例如,给定一颗\(N\)个节点的树(通常是无根树,即有\(N-1\)条无向边),我们可以选择任意节点作为根节点从而定义出每一颗子 ...
- 『快乐链覆盖 树形dp』
快乐链覆盖 Description 给定一棵 n 个点的树,你需要找至多 k 条互不相交的路径,使得它们的长度之和最大 定义两条路径是相交的:当且仅当存在至少一个点,使得这个点在两条路径中都出现 定义 ...
- 『树上匹配 树形dp』
树上匹配 Description 懒惰的温温今天上班也在偷懒.盯着窗外发呆的温温发现,透过窗户正巧能看到一棵 n 个节点的树.一棵 n 个节点的树包含 n-1 条边,且 n 个节点是联通的.树上两点之 ...
- 『金字塔 区间dp』
金字塔 Description 虽然探索金字塔是极其老套的剧情,但是这一队 探险家还是到了某金字塔脚下.经过多年的研究,科 学家对这座金字塔的内部结构已经有所了解.首先, 金字塔由若干房间组成,房间之 ...
- 『count 区间dp』
count Description 既然是萌萌哒 visit_world 的比赛,那必然会有一道计数题啦! 考虑一个N个节点的二叉树,它的节点被标上了1-N的编号. 并且,编号为i的节点在二叉树的前序 ...
随机推荐
- python执行shell实时输出
1.使用readline可以实现 import subprocess def run_shell(shell): cmd = subprocess.Popen(shell, stdin=subproc ...
- python基础(11):函数(一)
1. 什么是函数 1.我们到⽬前为⽌,已经可以完成⼀些软件的基础功能了.那么我们来完成这样⼀个功能: 约会: print("拿出⼿机") print("打开陌陌" ...
- TreeMap源码分析,看了都说好
概述 TreeMap也是Map接口的实现类,它最大的特点是迭代有序,默认是按照key值升序迭代(当然也可以设置成降序).在前面的文章中讲过LinkedHashMap也是迭代有序的,不过是按插入顺序或访 ...
- Dynamics CRM 2015/2016新特性之三十三:有了ExecuteTransactionRequest,再也不用担心部分成功部分失败了
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复216或者20160329可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- 【转载】Gradle for Android 第四篇( 构建变体 )
当你在开发一个app,通常你会有几个版本.大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本.这些版本通常有不同的设置,例如不同的URL地址.更可能的是你可能需要一个 ...
- Android监视器概述
还望支持个人博客站:http://www.enjoytoday.cn Android监视器可帮助您分析应用程序的性能,以便您优化,调试和改进它们. 它可以让您从硬件设备或Android模拟器监控应用程 ...
- [20191003]oracle number类型存储转化脚本.txt
[20191003]oracle number类型存储转化脚本.txt --//完善脚本,增加支持科学记数法.比如1e4之类的写法. 2.测试:$ cat test.txt012251234100-4 ...
- [20190909]完善vim的bccacl插件.txt
[20190909]完善vim的bccacl插件.txt http://blog.itpub.net/267265/viewspace-2140886/http://blog.itpub.net/26 ...
- Linux中的文件和目录结构详解
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- 7.Python网络编程_多线程共享全局变量问题
Python多线程支持全局变量的共享操作,但是它存在很多问题,先来看以下程序,该程序理论上执行完毕后全局变量g_num的值应该是2000000,但是在实际运行中,结果不足理论值 import thre ...