Description

探险队长凯因意外的弄到了一份黑暗森林的藏宝图,于是,探险队一行人便踏上了寻宝之旅,去寻找传说中的宝藏。
藏宝点分布在黑暗森林的各处,每个点有一个值,表示藏宝的价值。它们之间由一些小路相连,小路不会形成环,即两个宝藏点之间有且只有一条通路。探险队从其中的一点出发,每次他们可以留一个人在此点开采宝藏,也可以不留,然后其余的人可以分成若干队向这一点相邻的点走去。需要注意的是,如果他们把队伍分成两队或两队以上,就必须留一个人在当前点,提供联络和通讯,当然这个人也可以一边开采此地的宝藏。并且,为了节约时间,队伍在前往开采宝藏的过程中是不会走回头路的。现在你作为队长的助理,已经提供了这幅藏宝图,请你算出探险队所能开采的最大宝藏的价值。

Input

第一行有两个正整数n(1<=n<=100),表示藏宝点的个数,m(1<=m=100)表示探险队的人数。
第二行是n个不超过100的正整数,分别表示1到n每个点的宝藏价值。
接下来的n-1行,每行两个数,x和y(1<=x,y<=n,x<>y),表示藏宝点x,y之间有一条路,数据保证不会有重复的路出现。
假设一开始探险队在点1处。

Output

一个整数,表示探险队所能获得最大的宝藏价值。

Sample Input

5 3
1 3 7 2 8
1 2
2 3
1 4
4 5

题解

  • 又是一道树形dp,今天题做的要死了
  • 题目说:
  • 它们之间由一些小路相连,小路不会形成环,即两个宝藏点之间有且只有一条通路

  • 显然就是棵树
  • 容易得到设f[i][j]以i为根的子树,剩j的的最大价值
  • 那就有两种情况:
  • ①当前点不挖,直接跳
  • ②当前点留一个人挖,可以向下派j-1个人
  • 则有 f[i][j]=max(f[i][j],f[i][j-1-k]+f[son[i]][k]+v[i])
  • 那么我们不知道在f[i][j-1-k]中是否有v[i],如果有就算重了

  • 可以多定一个数组g,也可以多加一维,其实是一样的

  • g[i][j]表示 ]以i为根的子树,剩j,不挖i 的的最大价值

代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,m,cnt,v[110],f[110][110],to[210],from[210],head[110],k[110],g[110][110];
 6 void insert(int x,int y) { to[++cnt]=y; from[cnt]=head[x]; head[x]=cnt; }
 7 void dp(int root,int fa)
 8 {
 9     f[root][1]=v[root];
10     for (int w=head[root];w;w=from[w])
11         if (to[w]!=fa)
12         {
13             dp(to[w],root);
14             for (int i=1;i<=m;i++) k[i]=max(f[root][i],f[to[w]][i]);
15             for (int i=1;i<=m;i++)
16                 for (int j=1;j<i;j++)
17                     k[i]=max(k[i],g[root][i-j-1]+f[to[w]][j]+v[root]);
18             for (int i=1;i<=m;i++) f[root][i]=k[i];
19             for (int i=1;i<=m;i++) k[i]=max(f[to[w]][i],g[root][i]);
20             for (int i=1;i<=m;i++)
21                 for (int j=1;j<i;j++)
22                     k[i]=max(k[i],g[root][i-j]+f[to[w]][j]);
23             for (int i=1;i<=m;i++) g[root][i]=k[i];
24         }
25 }
26 int main()
27 {
28     scanf("%d%d",&n,&m);
29     for (int i=1;i<=n;i++) scanf("%d",&v[i]);
30     for (int i=1;i<=n-1;i++)
31     {
32         int x,y;
33         scanf("%d%d",&x,&y);
34         insert(x,y); insert(y,x);
35     }
36     dp(1,0);
37     printf("%d",f[1][m]);
38     return 0;
39 }

转载于:https://www.cnblogs.com/Comfortable/p/9277479.html

[树形dp] Jzoj P1046 寻宝之旅相关推荐

  1. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  2. [树形dp] Jzoj P3914 人品问题

    Description 网上出现了一种高科技产品--人品测试器.只要你把你的真实姓名输入进去,系统将自动输出你的人品指数.yzx不相信自己的人品为0.经过了许多研究后,yzx得出了一个更为科学的人品计 ...

  3. #树形dp#jzoj 1010 洛谷 3155 叶子的颜色

    题目 对于每个叶结点u,定义c[u]为从u到根结点的简单路径上第一个有色结点的颜色.给出每个c[u]的值,设计着色方案,使得着色结点的个数尽量少. 分析 这道题可以用树形dp,f[x][0/1]f[x ...

  4. [概率][lca][dfs][树形dp] Jzoj P4225 宝藏

    Description Input Output Sample Input 231 01 221 0 12 0 2 140 12 03 013 0 1 0 1 Sample Output 1.0000 ...

  5. [树形dp] Jzoj P5906 传送门

    Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normalgod扔进了一间实验室.这间实验室是一棵有n个节点的树 ...

  6. [树形dp] Jzoj P5814 树

    Description 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中 ...

  7. #基环树,树形dp#洛谷 2607 JZOJ 1723 骑士

    题目 有环的没有上司的舞会 分析 那么有环那就不是树形dp了,如何处理环,可以先连起来,树形dp,再把环断掉,再跑一次树形dp,两次的最大值即为答案 代码 #include <cstdio> ...

  8. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  9. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

最新文章

  1. TensorFlow练习20: 使用深度学习破解字符验证码
  2. linux mq清空消息队列,MQ消息队列搭建命令及方法
  3. Linux项目自动部署
  4. IntelliJ IDEA使用(二):tomcat和jetty配置(转自:http://www.cnblogs.com/jenkinschan/p/6052948.html)
  5. 【C语言】分别用下标法,地址法和指针法输出数组中的全部元素
  6. Pessimistic and Optimistic locking
  7. Effective C++条款4:确认对象钱已经被初始化
  8. java web 分页_Java Web(十一) 分页功能的实现
  9. 【POJ 1456】Supermarket【并查集】
  10. 线性代数学习点(五):向量运算规则的几何表示
  11. 第二人生的源码分析(三十)UDP接收数据和Windows网络关闭
  12. BLE(12)—— 细说 Connection
  13. 从写作到演讲,虾米君不断尝试的 2021|年终回顾
  14. MMORPG网络游戏开发之用户管理
  15. VSCode换行快捷方式及键盘快捷键重置
  16. Python3,5句话实现自动接收短信提醒
  17. STC51从入门到精通(汇编)~~~ 第一讲:概述
  18. Winsock 函数
  19. HQL:求出每个商品的打折天数
  20. 张艾迪(创始人):创始人故事无限N个

热门文章

  1. (原创) 对饱和状态NPN晶体管内部机制的理解分析
  2. MSP430F149的ADC12应用
  3. 理财平台频繁暴雷,羊毛党该要本金还是撸利息?
  4. 奥尼尔的话剧《榆树下的欲望》
  5. 自主学习 提问的智慧——学习中遇到难题怎么破?
  6. Hive注册表那点事(5.0 VS 6.0)
  7. pcm 采样率转换_All Video Converter Pro for mac(音视频格式转换器)
  8. 免安装版的mysql步骤_mysql免安装版的安装方法及步骤
  9. python中r55的执行结果是_import numpy as np
  10. mysql 分表索引_mysql中,分表查询和索引查询哪个更快?