题意是给出一棵树,每个点都有一个权值,从1开始,最多走k步,问能够经过的所有的点的权值和最大是多少(每个点的权值只能被累加一次)。

  考虑到一个点可以经过多次,设dp状态为dp[i][j][k],i表示当前从i出发,j表示最多走j步,k=0的话表示最后回到i点,否则不回到i点的子问题的答案。

  转移见代码。

  值得注意的是dfs中j循环的方向必须从大到小,因为如果从小到大,当前的j是从比其小的dp[u][j-t][...]更新过来的,而后者是根据走了v以后的更新过来的。换言之,如果从小到大,那么,走v贡献的权值就会被计算多次了,而题目中给的条件是,一个点的权值只能计算一次。拓展一下的话,如果一个点的权值可以被计算多次,那么应当从小到大循环j。

  不妨以下面这组数据为例可以找到区别:

  3 3
  1 100 1
  1 2
  1 3

  代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
const int N = + ; int n,k;
int val[N];
vector<int> G[N];
int dp[N][N*][]; // 0 表示回到原地
void update(int & a,int b) {if(a < b) a = b;}
int dfs(int u,int fa)
{
for(int i=;i<G[u].size();i++)
{
int v = G[u][i];
if(v == fa) continue;
dfs(v,u);
// j必须从大到小(?)
for(int j=k;j>=;j--)
{
for(int t=;t<=j;t++)
{
// 最终都回到原地,那么左右都需要回到原地,此时需要多走两步 u->v & v->u
if(t >= ) update(dp[u][j][], dp[u][j-t][] + dp[v][t-][]);
// 最终不用回到原地,有只要左边或者右边一种选择不用回到原地即可
if(t >= ) update(dp[u][j][], dp[u][j-t][] + dp[v][t-][]);
update(dp[u][j][], dp[u][j-t][] + dp[v][t-][]);
}
}
}
} int main()
{
while(scanf("%d%d",&n,&k) == )
{
memset(dp,,sizeof dp);
for(int i=;i<=n;i++)
{
G[i].clear();
scanf("%d",val+i);
for(int j=;j<=k;j++) dp[i][j][] = dp[i][j][] = val[i];
}
for(int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(, -);
printf("%d\n",max(dp[][k][], dp[][k][]));
}
return ;
}

最新文章

  1. 双十一 VS 火车票(12306)
  2. BLOCK封装带菊花的网络请求
  3. 《转》iOS音频视频初级开发
  4. Python快速建站系列-Part.Two-结构化和布局
  5. python IDLE 改变窗口背景颜色
  6. UIButton设置imgae图片自适应button的大小且不变形
  7. 蓝桥杯 入门训练 Fibonacci数列
  8. 6 款国外开源web oa办公系统(转)
  9. 获得设备型号(含iPhone6 , iPhone 6+)
  10. spring 配置文件 数据库引入
  11. 我和小美的撸码日记(3)之一句话搞定MVC表单页数据绑定与提交
  12. [译]Stairway to Integration Services Level 8 - SSIS 工作流管理高级
  13. 部署到IIS后出现ORA-12560的解决办法
  14. Java中设计模式之单例设计模式-1
  15. eclipse快速配置spring相关xml文件头信息
  16. jmeter插件安装
  17. 第56节:ArrayList,LinkedList和String
  18. OpenStack的基础原理
  19. iOS性能优化篇 —— 耗电优化总结
  20. 解决waveInOpen录音编译x64程序出错的问题

热门文章

  1. 程序员与数据库打交道的JDBC知识概要
  2. 【Redis】事务 (超详细)
  3. Mongodb 的ORM框架 Morphia 注解 之 @Reference
  4. mesos-master启动失败,报错Failed to load unknown flag &#39;quorum.rpmsave&#39;
  5. [Selenium3+python3.6]自动化测试3-八种元素元素定位(Firebug和firepath)
  6. JSONPlaceholder - 免费的在线REST服务(提供测试用的HTTP请求假数据)
  7. PAT Advanced 1073 Scientific Notation (20 分)
  8. sql 发生死锁
  9. Ubuntu系统---C++之VScode IDE 编译器安装
  10. ndk学习之C语言基础复习----结构体、共用体与C++开端