POJ 2486 树形背包DP Apple Tree
2024-08-29 20:11:42
设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 ;
}
代码君
最新文章
- SQL Tuning 基础概述02 - Explain plan的使用
- CMake
- 定位 position: absolute &; relative
- BT协议分析(1)&mdash;1.0协议
- codeforces 499B.Lecture 解题报告
- POJ——3984
- Mysql命令alter add:增加表的字段
- 【原】Redis-LRU缓存
- asp.net mvc4 webapi Post 参数 字符串
- select的使用(二)
- 【1】JAVA---地址App小软件(AddressApp.class)(初步接触项目开发的分层思想)(表现层)
- 基于visual Studio2013解决C语言竞赛题之1080填运算符
- 《Effective C++ 》学习笔记——条款02
- poj2386
- Eclipse JDK的安装
- ACM讲座心得
- Conda常见命令
- PWA 渐进式Web应用程序 - 解释
- day 19 - 1 模块
- nginx 系列 1 linux下安装以及配置IIS分发