bzoj4557 [JLoi2016]侦察守卫——DP】的更多相关文章

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 见这位的博客:https://www.cnblogs.com/Narh/p/9140326.html 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; ,inf=1e9; ll w[maxn],f[max…
BZOJ4557 JLoi2016 侦察守卫 Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的树.游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦查守卫后,它可以监视这个点以及与这个点的距离在D以内的所有点.这里两个点之间的距离定义为它们在树上的距离,也就是两个点之间唯一的简单路径上所经过边的条数.在一个点上放置侦查守卫需要付出一定的代价,在不同点放置守卫的代价可能不…
首先可以确定是树形DP,但这里存在跨子树的信息传递问题,这里就需要“借”的思想. f[i][j]表示i子树内所有点都被覆盖到,且i以外j层内的点都能被覆盖到 的方案数. g[i][j]表示i子树内离i距离不小于j的点都被覆盖到 的方案数. 这里f做了一个前缀和,g做了一个后缀和. 那么f有转移: 1.目前以x为根的子树还有点没被覆盖到,让新加的y子树内的守卫来覆盖. f[x][j]=g[x][j+1]+f[k][j+1] 2.目前x子树以完全覆盖,那么允许y子树存在未覆盖的点. f[x][j]=…
下称放置守卫的点为监控点.设f[i][j]为i子树中深度最大的未被监视点与i的距离不超过j时的最小代价,g[i][j]为i子树中距离i最近的监控点与i的距离不超过j且i子树内点全部被监视时的最小代价.开始觉得这只能设成三维状态对这种二维的纠结了半天要怎么处理子树内有点未被监视但监控点的范围可以延伸到子树外的情况冷静了好长时间终于发现自己果然是个弱智既然子树内有点要被监视在子树外监控这个点的点之后带来的效果就肯定要比子树内的监控点强所以根本不用管子树内的监控点了不写标点发泄一下内心的心态爆炸. 考…
http://www.lydsy.com/JudgeOnline/problem.php?id=4557 假设当前到了x的子树,现在是合并 x的第k个子树 f[x][j] 表示x的前k-1个子树该覆盖的完全覆盖,而且还能向上覆盖j层的最小代价 这个向上是针对x来说的,即可以向x的祖先方向再覆盖j层 对于第k个子树的意义就是,兄弟子树放置的守卫可以帮x的第k个子树覆盖前j层(第1层为x的子节点) 那么相应的就要有一个状态来表示这个 可以让兄弟子树 帮忙覆盖 的前j层 g[x][j] 表示还需要覆盖…
[BZOJ4557][JLoi2016]侦察守卫 Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的树.游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦查守卫后,它可以监视这个点以及与这个点的距离在D以内的所有点.这里两个点之间的距离定义为它们在树上的距离,也就是两个点之间唯一的简单路径上所经过边的条数.在一个点上放置侦查守卫需要付出一定的代价,在不同点放置守卫的代价可…
4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 297  Solved: 200[Submit][Status][Discuss] Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的 .换句话说,游戏的地图是一棵有N个节点的树.游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦 查守卫后,它可以监视这个点以及与这个点的距离…
bzoj 4557: [JLoi2016]侦察守卫 设f[x][j]表示覆盖以x为根的子树的所有应该被覆盖的节点,并且以x为根的子树向下j层全部被覆盖的最小代价. 设g[x][j]表示与x距离大于j全部应该覆盖的节点全部被覆盖的最小代价. 有 f[u][j] = min{f[u][j]+g[v][j],g[u][j+1]+f[v][j+1],f[u][j+1]} g[u][j] = min{g[u][j-1],g[u][j]+g[v][j-1]} 边界f[u][d+1] = inf;f[u][i…
4557: [JLoi2016]侦察守卫 链接 分析: 因为D比较小,所设状态f[i][j]表示子树i内,从i往下第j层及第j层以下都覆盖了的最小代价,g[i][j]表示覆盖完子树内所有点,还可以往上覆盖j层的最小花费. g的转移从子树内转移的时候,可以覆盖其他子树内的点, f数组直接求和即可. 最后要对g维护一下后缀最小值,对i维护前缀最小值.因为往上覆盖i+1的,一定可以更新往上覆盖i层的:往下有i层未覆盖的,一定可以更新往下有i-1层未覆盖的. 代码: #include<cstdio>…
设f[u][i]为u点向下覆盖至少i层并且处理完u的子树的最小代价,f[u][i]为u点向上覆盖至少i层并且处理完u的子树的最小代价 转移的话显然f[u][i]+=f[v][i-1],但是f[u][0]不好确定,可以知道f[u][0]=g[u][0],而g的转移是g[u][j]=min(g[u][j]+f[e[i].to][j],f[u][j+1]+g[e[i].to][j+1]),所以就可以求了 #include<iostream> #include<cstdio> using…