题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4557

树形DP。和“河流”有点像,也有一个类似“承诺”的东西。

  就是用 f 表示当前节点向下 j 层之下的需覆盖点已覆盖的费用。答案可以是 f [ root ] [0] 。(root是随便一个点)

    最好把当前节点看作第1层而不是第0层,这样就能用0表示当前节点的子树全覆盖了。

  为了转移,引入一个 g ,表示当前点在自己子树全覆盖的基础上可以向外覆盖 j 层。这时当前节点可以自然地看作第0层了。

    这也是为什么 f 表示的是“向下 j 层之下的点全覆盖”而不是“向下 j 层全覆盖”。就是为了方便转移。

      没错,因为如果记成“向下 j 层全覆盖”,那么记录下“还有一些没覆盖”这一状态也根本没用,因为兄弟节点都是从上往下帮自己覆盖的;

      而像这样记录成“向下还有 j 层没覆盖”,就有更多“把它们覆盖好”的机会,也方便转移等等,变得很顺畅!

具体转移的时候,发现 g 的转移依赖 f (上一次的 f 值),而 f 的转移不依赖 g ,所以要先求g的值。

  可以用g[0]来更新 f [0] 的值,因为f [0] 是从当前节点的孩子们的 f 那里转移不过来的。

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=5e5+,D=;const ll INF=0x7fffffff;
int n,m,d,head[N],xnt;
ll a[N],f[N][D],g[N][D];
bool need[N];
struct Edge{
int next,to;
Edge(int n=,int t=):next(n),to(t) {}
}edge[N<<];
void add(int a,int b)
{
edge[++xnt]=Edge(head[a],b);head[a]=xnt;
edge[++xnt]=Edge(head[b],a);head[b]=xnt;
}
void dfs(int cr,int fa)
{
f[cr][]=g[cr][]=need[cr]?a[cr]:;//只有根节点时的状态
for(int j=;j<=d;j++)g[cr][j]=a[cr];//初值
g[cr][d+]=INF;
for(int i=head[cr],v;i;i=edge[i].next)
{
if((v=edge[i].to)==fa)continue;
dfs(v,cr);
for(int j=;j<=d;j++)g[cr][j]=min(g[cr][j]+f[v][j],f[cr][j+]+g[v][j+]);//从0开始
for(int j=d;j;j--)g[cr][j-]=min(g[cr][j-],g[cr][j]);
f[cr][]=g[cr][]; //
for(int j=;j<=d;j++)f[cr][j]+=f[v][j-]; //这个不要放在28行之前,因为该行要用到上一次的值
for(int j=;j<=d;j++)f[cr][j]=min(f[cr][j],f[cr][j-]);
}
}
int main()
{
scanf("%d%d",&n,&d);for(int i=;i<=n;i++)scanf("%lld",&a[i]);
scanf("%d",&m);int tmp;for(int i=;i<=m;i++){scanf("%d",&tmp);need[tmp]=;}
int x,y;
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);add(x,y);
}
// memset(g,1,sizeof g);
dfs(,);
printf("%lld",f[][]);
return ;
}

最新文章

  1. cookie,session原理,以及如何使用chrome查看。
  2. Oracle日期函数和循环总结
  3. mybatis配置文件xml中插入新数据
  4. Rsync详解
  5. hdu---(1054)Strategic Game(最小覆盖边)
  6. Java IO (1) - InputStream
  7. C#_ 项目打包附加数据库
  8. Ubuntu 误改/etc/sudoers 文件权限
  9. [转]利用excel进行线性规划求解
  10. Oracle列转行函数版本不兼容解决方案
  11. sublime text3 的汉化
  12. 【强化学习】用pandas 与 numpy 分别实现 q-learning, saras, saras(lambda)算法
  13. ORA-64379: Action cannot be performed on the tablespace assigned to FastStart while the feature is enabled
  14. MVC DropDownList
  15. Scrapy学习篇(五)之Spiders
  16. 使用 MD5 加密 去重对插入的影响
  17. nginx servername配置域名网站可以正常登录,servername配置IP+Port却无法正常登录
  18. Oracle下通过EXPDP导出某用户下的所有表,实例
  19. three.js入门系列之旋转的圆台、球体、正方体
  20. 【转】利用 Apache JMeter 测试 WebSphere 性能

热门文章

  1. 记录selenium操作
  2. 【Python】__all__ 暴露接口
  3. 【Error】 : make 不是内部或外部命令,也不是可运行的程序
  4. Markdown_02_作图
  5. C++/C extern关键字详解 EntryPointNotFoundException处理
  6. 【LeetCode 100_二叉树_遍历】Same Tree
  7. (转)MapReduce Design Patterns(chapter 6 (part 2))(十二)
  8. GPU编程自学4 —— CUDA核函数运行参数
  9. C++里的单体类实现
  10. js之放大镜效果