设d(u, j, 0)表示在以u为根的子树中至多走k步并且最终返回u,能吃到的最多的苹果。

则有状态转移方程:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; const int maxn = + ;
const int maxk = + ;
int n, k; int a[maxn];
int d[maxn][maxk][];
vector<int> G[maxn]; void 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);
for(int j = k; j >= ; j--)
for(int t = ; t <= j; t++)
{
if(t > ) d[u][j][] = max(d[u][j][], d[u][j-t][] + d[v][t-][]);
if(t > ) d[u][j][] = max(d[u][j][], d[u][j-t][] + d[v][t-][]);
d[u][j][] = max(d[u][j][], d[u][j-t][] + d[v][t-][]);
}
}
} int main()
{
while(scanf("%d%d", &n, &k) == && n)
{
for(int i = ; i <= n; i++) G[i].clear();
memset(d, , sizeof(d));
for(int i = ; i <= n; i++)
{
scanf("%d", a + i);
for(int j = ; j <= k; j++) d[i][j][] = d[i][j][] = a[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(d[][k][], d[][k][]));
} return ;
}

代码君

最新文章

  1. SQL Tuning 基础概述02 - Explain plan的使用
  2. CMake
  3. 定位 position: absolute &amp; relative
  4. BT协议分析(1)&mdash;1.0协议
  5. codeforces 499B.Lecture 解题报告
  6. POJ——3984
  7. Mysql命令alter add:增加表的字段
  8. 【原】Redis-LRU缓存
  9. asp.net mvc4 webapi Post 参数 字符串
  10. select的使用(二)
  11. 【1】JAVA---地址App小软件(AddressApp.class)(初步接触项目开发的分层思想)(表现层)
  12. 基于visual Studio2013解决C语言竞赛题之1080填运算符
  13. 《Effective C++ 》学习笔记——条款02
  14. poj2386
  15. Eclipse JDK的安装
  16. ACM讲座心得
  17. Conda常见命令
  18. PWA 渐进式Web应用程序 - 解释
  19. day 19 - 1 模块
  20. nginx 系列 1 linux下安装以及配置IIS分发

热门文章

  1. springMVC-RESTful支持
  2. 排错:expected unqualified-id before string constant
  3. python学习之调试 错误捕捉及处理
  4. ES6语言特性,如何在低版本浏览器运行它
  5. net core 在docker(ubuntu)部署
  6. JVM垃圾回收机制一
  7. 几款LINUX下的CHM查看器
  8. 自定义可伸缩的imageView
  9. UISearchBar clearButton
  10. 运行spark自带的例子出错及解决