BZOJ4557 JLoi2016 侦察守卫 【树形DP】*
BZOJ4557 JLoi2016 侦察守卫
Description
小R和B神正在玩一款游戏。这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的。换句话说,游戏的地图是一棵有N个节点的树。游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦查守卫后,它可以监视这个点以及与这个点的距离在D以内的所有点。这里两个点之间的距离定义为它们在树上的距离,也就是两个点之间唯一的简单路径上所经过边的条数。在一个点上放置侦查守卫需要付出一定的代价,在不同点放置守卫的代价可能不同。现在小R知道了所有B神可能会出现的位置,请你计算监视所有这些位置的最小代价。
Input
第一行包含两个正整数N和D,分别表示地图上的点数和侦查守卫的视野范围。约定地图上的点用1到N的整数编号。第二行N个正整数,第i个正整数表示在编号为i的点放置侦查守卫的代价Wi。保证Wi≤1000。第三行一个正整数M,表示B神可能出现的点的数量。保证M≤N。第四行M个正整数,分别表示每个B神可能出现的点的编号,从小到大不重复地给出。接下来N–1行,每行包含两个正整数U,V,表示在编号为U的点和编号为V的点之间有一条无向边。N<=500000,D<=20
Output
仅一行一个整数,表示监视所有B神可能出现的点所需要的最小代价
Sample Input
12 2
8 9 12 6 1 1 5 1 4 8 10 6
10
1 2 3 5 6 7 8 9 10 11
1 3
2 3
3 4
4 5
4 6
4 7
7 8
8 9
9 10
10 11
11 12
Sample Output
10
题目大意是给你一棵树上有一些染了色的点
然后你可以选一些点进行标记,一个标记了的点可以覆盖距离它自己不超过d的点
标记每个点有不同的花费
求最小的覆盖所有染色点的花费
#include<bits/stdc++.h>
using namespace std;
#define N 500010
#define D 22
#define INF 0x3f3f3f3f
struct Edge{int v,next;}E[N<<1];
int head[N],tot=0;
int n,m,d,w[N];
int f[N][D],g[N][D],dp[N];
int mark[N];
void add(int u,int v){
E[++tot]=(Edge){v,head[u]};
head[u]=tot;
}
void dfs(int u,int fa){
if(mark[u])f[u][0]=g[u][0]=w[u];
for(int i=1;i<=d;i++)f[u][i]=w[u];
f[u][d+1]=INF;
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v==fa)continue;
dfs(v,u);
for(int j=d;j>=0;j--)f[u][j]=min(f[u][j]+g[v][j],f[v][j+1]+g[u][j+1]);
for(int j=d;j>=0;j--)f[u][j]=min(f[u][j],f[u][j+1]);
g[u][0]=f[u][0];
for(int j=1;j<=d;j++)g[u][j]+=g[v][j-1];
for(int j=1;j<=d;j++)g[u][j]=min(g[u][j],g[u][j-1]);
}
g[u][d+1]=min(g[u][d+1],g[u][d]);
}
int main(){
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++){
int x;scanf("%d",&x);
mark[x]=1;
}
for(int i=1;i<n;i++){
int u,v;scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs(1,0);
printf("%d",f[1][0]);
return 0;
}
BZOJ4557 JLoi2016 侦察守卫 【树形DP】*的更多相关文章
- [BZOJ4557][JLOI2016]侦察守卫(树形DP)
首先可以确定是树形DP,但这里存在跨子树的信息传递问题,这里就需要“借”的思想. f[i][j]表示i子树内所有点都被覆盖到,且i以外j层内的点都能被覆盖到 的方案数. g[i][j]表示i子树内离i ...
- 【BZOJ4557】[JLoi2016]侦察守卫 树形DP
[BZOJ4557][JLoi2016]侦察守卫 Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地 ...
- 洛谷 P3267 [JLOI2016/SHOI2016]侦察守卫(树形dp)
题面 luogu 题解 树形\(dp\) \(f[x][y]表示x的y层以下的所有点都已经覆盖完,还需要覆盖上面的y层的最小代价.\) \(g[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上 ...
- BZOJ4557 JLOI2016侦察守卫(树形dp)
下称放置守卫的点为监控点.设f[i][j]为i子树中深度最大的未被监视点与i的距离不超过j时的最小代价,g[i][j]为i子树中距离i最近的监控点与i的距离不超过j且i子树内点全部被监视时的最小代价. ...
- bzoj4557 [JLoi2016]侦察守卫——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 见这位的博客:https://www.cnblogs.com/Narh/p/91403 ...
- bzoj千题计划272:bzoj4557: [JLoi2016]侦察守卫
http://www.lydsy.com/JudgeOnline/problem.php?id=4557 假设当前到了x的子树,现在是合并 x的第k个子树 f[x][j] 表示x的前k-1个子树该覆盖 ...
- 洛谷 P3267 - [JLOI2016/SHOI2016]侦察守卫(树形 dp)
洛谷题面传送门 经典题一道,下次就称这种"覆盖距离不超过 xxx 的树形 dp"为<侦察守卫模型> 我们考虑树形 \(dp\),设 \(f_{x,j}\) 表示钦定了 ...
- Luogu3267 [JLOI2016/SHOI2016]侦察守卫 (树形DP)
树形DP,一脸蒙蔽.看了题解才发现它转移状态与方程真不愧神题! \(f[x][y]\)表示\(x\)的\(y\)层以下的所有点都已经覆盖完,还需要覆盖上面的\(y\)层的最小代价. \(g[x][y] ...
- 动态规划(树形DP):LNOI 2016 侦察守卫
Sample Input 12 2 8 9 12 6 1 1 5 1 4 8 10 6 10 1 2 3 5 6 7 8 9 10 11 1 3 2 3 3 4 4 5 4 6 4 7 7 8 8 9 ...
随机推荐
- 一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断?
我们有2台内部http服务(nginx): 201:这台服务器部署的服务是account.api.91160.com,这个服务是供前端页面调用: 202:这台服务器部署的服务是hdbs.api.911 ...
- vue element new vue const
new Vue{ el:"app", } ========= const app = new Vue({ router, data:{....} }).$mount('#app') ...
- es6之Iterator
1.任何数据结构只要部署了Iterator接口(本质是一个指针对象),也就是部署了Symbol.iterator属性,便可以完成遍历操作:数组原生就具备Iterator接口,就可以用for...of遍 ...
- 第三天 RHEL7-Unix/Linux系统 介绍
如何称为一名优秀的linux运维人员? 如果你有机会和条件:环境能够磨练一个人的能力和意志. 大胆的做你从未做过的项目,每一个项目都是对自身的极大提升. 有好的环境资源不要浪费,好好把握,慢慢进步. ...
- 文件上传及时显示, 前端js和后端php相互结合使用
文件读取 javascript 绑定文件上传变化事件 onchange 利用window对象 FileReader 调用方法 readerAsDataURL onload 方法 异步读取 属性:fil ...
- Markdown_02_作图
[TOC] 前言 一.序列图(Sequence) 序列图由 js-sequence提供支持,可以将代码块转成序列图 示例如下: ```sequence Title: Here is a title A ...
- 【LeetCode 67_字符串_算术运算】Add Binary
string addBinary(string a, string b) { int alen = a.size(); int blen = b.size(); ) return b; ) retur ...
- 《Effective C++》第4章 设计与声明(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- SpringInAction--Bean参数的自动注入
前面我已经学过了,将一个bean引用注入到另一个bean的属性或构造器参数中,这边指的是将一个对象与另一个对象进行关联. 我们学过的方法是在创建的时候根据new对象的时候,注入参数,如下: @Bean ...
- IGMP技术总结
转载自:IGMP技术总结 本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一.小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! 1. IGMP ...