动态规划(树形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
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 侦察守卫的更多相关文章
- 动态规划——树形dp
动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...
- UOJ#290. 【ZJOI2017】仙人掌 仙人掌,Tarjan,计数,动态规划,树形dp,递推
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. ...
- 洛谷 P3267 - [JLOI2016/SHOI2016]侦察守卫(树形 dp)
洛谷题面传送门 经典题一道,下次就称这种"覆盖距离不超过 xxx 的树形 dp"为<侦察守卫模型> 我们考虑树形 \(dp\),设 \(f_{x,j}\) 表示钦定了 ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- 树形DP——动态规划与数据结构的结合,在树上做DP
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...
- 【动态规划】树形DP完全详解!
蒟蒻大佬时隔三个月更新了!!拍手拍手 而且是更新了几篇关于DP的文章(RioTian狂喜) 现在赶紧学习和复习一下树形DP.... 树形DP基础:Here,CF上部分树形DP练习题:Here \[QA ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 动态规划(树形DP):HDU 5834 Magic boy Bi Luo with his excited tree
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8UAAAJbCAIAAABCS6G8AAAgAElEQVR4nOy9fXQcxZ0uXH/hc8i5N+
- 树形动态规划(树形DP)入门问题—初探 & 训练
树形DP入门 poj 2342 Anniversary party 先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...
随机推荐
- 原生js的数组除重复
js对数组的操作在平常的项目中也会遇到,除去一些增加,或者减少的操作外,还有一个比较重要的操作就是数组的除重,通过数组的除重,我们可以将一个数组中存在的多个重复的数组进行清理,只留下不重复的.另外下面 ...
- 在终端里使用 Solarized 配色方案
在终端里使用 Solarized 配色方案 参考: 1.在 Mac OS X 终端里使用 Solarized 配色方案 2.solarized
- CCPC网络赛,HDU_5842 Lweb and String
Problem Description Lweb has a string $S$. Oneday, he decided to transform this string to a new sequ ...
- IOS 学习日志 2015-3-17
Objective--C 一 关键字 @class 导入已有的类 id 对象类型 表示任何一个ObjC对象类型 Block 对象类型 OC中称为代码块 类似于C中的函数式指针 typedef 定义数据 ...
- ASP.NET前端语法应用
字符拼接 <%# "abc" + Eval("列名").ToString() %> <%# Eval("列名"," ...
- apache基本安装配置
1.安装apache 1.安装 wget http://mirrors.cnnic.cn/apache//httpd/httpd-2.2.31.tar.gz 2.安装zlib yum install ...
- Ubuntu下Java环境配置
Oracle Java安装: 通过以下命令进行安装: sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt ...
- 数据结构学习——shell排序的C语言实现
shell排序: 这个排序的命名是来自发明者的名字,和排序的方法没有字面上的联系.所以不要因为名字而感觉很难.在K&R的C程序设计语言中书中只用了几行代码很简洁的实现了这个排序算法.那就来看看 ...
- Config IIS server6.0-- HTTP 错误 500.21 - Internal Server Error 解决方案
HTTP 错误 500.21 - Internal Server Error 解决方案 不久前重新安装了Windows7,在安装了VS2010 开发平台之后,将网站发布到IIS,访问发 ...
- C# 翻页设计:首页,上一页,下一页,末页 ,跳转
int pageSize = 0; //每页显示行数 int nMax = 0; //总记录数 int pageCount = 0; //页数=总记录数/每页显示行数 int pageCurrent ...