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. Excel对话框大全

    Excel对话框大全 序号 名称 描述 1 Application.Dialogs(1).Show 是调用打开对话框  2 Application.Dialogs(5或145).Show 是调用另存为 ...

  2. 10.20_wiki

    XWiki:官网.Documentation.User's GuideProgrammer's GuideAdministrator's Guide Developer's Guide (1) htt ...

  3. Name control

    static: (Page 406) In both C and C++ the keyword static has two basic meanings, which unfortunately ...

  4. 每天一条linux命令——shutdown

    shutdown命令用来系统关机命令.shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作. 语法: shutdown(选项)(参数) 选项: -c:当执行“shutdown ...

  5. 检测 IE 版本 in Javascript

    点击打开链接http://stackoverflow.com/questions/10964966/detect-ie-version-in-javascript <!doctype html& ...

  6. Python3 函数式编程

    函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变量的程序设计语言,由 ...

  7. jQuery EasyUI 提示框(Messager)用法

    jQuery EasyUI 提示框(Messager)不仅强大,而且也不用任何的HTML代码,只需要按照<jQuery EasyUI框架使用文档>包含必要文件后,在$(function() ...

  8. php中将地址生成迅雷快车旋风链接的代码

    function zhuanhuan() { $urlodd=explode('//',$_GET["url"],2);//把链接分成2段,//前面是第一段,后面的是第二段 $he ...

  9. Sencha Touch Guide

     1.一些命令 创建APP #  Make sure the current working directory is the Sencha Touch 2 SDK 例如D:\Program File ...

  10. 错误 1 error C2065: “IDC_LISTBOX”: 未声明的标识符

    错误的可能原因及解决方法如下:1.出错文件中没有包含资源文件ID声明的resource.h文件.在出错文件中加入#include “resource.h”语句. 2.工程附件包含目录的路径下没有res ...