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

  这道题考虑树形DP,dp[x][i]表示由此点向下走i步到达的点监控,由于有的点不需要被监控,再开一个变量记录即可,转移并不复杂,推一推就出来了。

  可能我的代码有瑕疵,有些地方可能不必要(毕竟DP有时候想不清),但是不影响正确性。

 #include <iostream>
#include <cstring>
#include <cstdio>
#define dp(x,y) dp[x][y+20]
using namespace std;
const int N=,D=,INF=;
int n,m,d,w[N],dp[N][D*],f[N];bool vis[N];
int cnt,fir[N],to[N*],nxt[N*];
void addedge(int a,int b){
nxt[++cnt]=fir[a];to[fir[a]=cnt]=b;
nxt[++cnt]=fir[b];to[fir[b]=cnt]=a;
} int st[N],top;
int m1[N],m2[N];
void DP(int x,int fa){
int flag=;
for(int i=fir[x];i;i=nxt[i])
if(to[i]!=fa)flag=,DP(to[i],x); if(!flag){
f[x]=vis[x]?INF:;dp(x,)=w[x];
for(int i=;i<=d;i++)dp(x,i)=INF;
return;
} top=;
for(int i=fir[x];i;i=nxt[i])
if(to[i]!=fa)st[++top]=to[i]; //处理f[x]
if(!vis[x])
for(int i=,M;i<=top;i++){
M=f[st[i]];
for(int j=;j<=d;j++)
M=min(M,dp(st[i],j));
f[x]+=M;
}
else f[x]=INF; //处理dp(x,0)
dp(x,)=w[x];
for(int i=,M;i<=top;i++){
M=f[st[i]];
for(int j=-d;j<=d;j++)
M=min(M,dp(st[i],j));
dp(x,)+=M;
} //处理向上看的
for(int i=;i<=top;i++){
m2[i]=f[st[i]];
for(int j=;j<=d;j++)
m2[i]=min(m2[i],dp(st[i],j));
m1[i]=INF;
} for(int i=-d;i<=-;i++)
for(int j=;j<=top;j++){
dp(x,i)+=min(m1[j],m2[j]);
m1[j]=min(m1[j],dp(st[j],i));
} //处理向下看的
for(int i=;i<=top;i++){
m2[i]=f[st[i]];
for(int j=;j<=d;j++)
m2[i]=min(m2[i],dp(st[i],j));
m1[i]=INF;
} for(int i=d,M;i>=;i--){
M=-INF;
for(int j=;j<=top;j++){
dp(x,i)+=min(m1[j],m2[j]);
M=max(M,min(m1[j],m2[j])-dp(st[j],i-));
m1[j]=min(m1[j],dp(st[j],-i));
}
dp(x,i)-=M;
}
} int main(){
freopen("observer.in","r",stdin);
freopen("observer.out","w",stdout);
scanf("%d%d",&n,&d);
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
scanf("%d",&m);
for(int i=,x;i<=m;i++){
scanf("%d",&x);
vis[x]=true;
}
for(int i=,a,b;i<n;i++){
scanf("%d%d",&a,&b);
addedge(a,b);
}
DP(,);
int ans=f[];
for(int i=;i<=d;i++)
ans=min(ans,dp(,i));
printf("%d\n",ans);
return ;
}

动态规划(树形DP):LNOI 2016 侦察守卫的更多相关文章

  1. 动态规划——树形dp

    动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...

  2. UOJ#290. 【ZJOI2017】仙人掌 仙人掌,Tarjan,计数,动态规划,树形dp,递推

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. ...

  3. 洛谷 P3267 - [JLOI2016/SHOI2016]侦察守卫(树形 dp)

    洛谷题面传送门 经典题一道,下次就称这种"覆盖距离不超过 xxx 的树形 dp"为<侦察守卫模型> 我们考虑树形 \(dp\),设 \(f_{x,j}\) 表示钦定了 ...

  4. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

  5. 树形DP——动态规划与数据结构的结合,在树上做DP

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...

  6. 【动态规划】树形DP完全详解!

    蒟蒻大佬时隔三个月更新了!!拍手拍手 而且是更新了几篇关于DP的文章(RioTian狂喜) 现在赶紧学习和复习一下树形DP.... 树形DP基础:Here,CF上部分树形DP练习题:Here \[QA ...

  7. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  8. 动态规划(树形DP):HDU 5834 Magic boy Bi Luo with his excited tree

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8UAAAJbCAIAAABCS6G8AAAgAElEQVR4nOy9fXQcxZ0uXH/hc8i5N+

  9. 树形动态规划(树形DP)入门问题—初探 & 训练

    树形DP入门 poj 2342 Anniversary party   先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...

随机推荐

  1. SqlServer Alter Table 语句的用法

    更改 字段的数据类型 Alter Table TB_ITM_ITEM alter column is_timing int NULL; 新增字段: alter table WeiboSmartCate ...

  2. js判断主流浏览器类型和版本号

    如今的互联网中,浏览器可以说是太多太多了,但是大部分都是换壳不换心,基本上主流的浏览器还是火狐,谷歌,IE,safrai这几种比较常见,所以在我们的开发中,有时候需要遇到判断用户正在使用什么浏览器以及 ...

  3. 24种设计模式--观察者模式【Observer Pattern】

     <孙子兵法>有云: “知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好 ...

  4. JavaWeb网上商城的反思

    不知道从什么时候起,我爱上了写博客,对之前学得的只是进行反思.写了几天课程设计,代码量量8.9千左右. 然后下面文字是我在博客上复制过来的,说得很详细 MVC(Model View Controlle ...

  5. 读书笔记之 - javascript 设计模式 - 工厂模式

    一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一 ...

  6. php 文件路径设置 set_include_path(); get_include_path();

    <?php set_include_path($string); //设置路径 get_include_path(); // 获取当前的路径 //例如:文件路径为: //D:/phpweb/de ...

  7. word中几个好用的宏代码(立方米上标、关闭样式自动更新、删除无效样式、表格加粗边框、宋体引号)

    Sub 替换立方米() With Selection.Find .Text = "m3" .Replacement.Text = "mm3" .Forward ...

  8. [转]jquery.timer用法

    转自:http://www.cnblogs.com/guohui/archive/2012/02/24/2366668.html 来自JavaEye论坛的JQuery Timers应用知识 jQuer ...

  9. STM32固件库

    一.STM32固件库开发和传统寄存器开发方式的区别 二.CMSIS标准 CMSIS标准--Cortex Microcontroller Software Interface Standard,是ARM ...

  10. Ubuntu下Memcache的安装与基本使用

    安装Memcache Memcache分为两部分,Memcache服务端和客户端.Memcache服务端是作为服务来运行的,所有数据缓存的建立,存储,删除实际上都是在这里完成的.客户端,在这里我们指的 ...