Apple Tree POJ - 2486
题目大意:一棵点带权有根树,根节点为1。从根节点出发,走k步,求能收集的最大权值和。
树形dp。复杂度可能是O(玄学),不会超过$O(nk^2)$。(反正这题不卡这个,考思想)参考
ans[i][j][0]表示i点以下共走j步,不回来,可能收集到最大的权值
ans[i][j][1]表示i点以下共走j步,回来,可能收集到最大的权值
比较复杂的是,每个节点(以下称当前节点)从其子节点转移的时候,需要用一个背包:
t[i][j][0]表示当前节点的前i个子节点共走j步,不回来
t[i][j][1]表示当前节点的前i个子节点共走j步,回来
对于t[i][j][0],要么是当前节点的前i-1个子节点共走j步(包括去和回来前面的子节点所用步数),在之前就不回来;
要么是前i-1个子节点共走j-p步(包括去和回来前面的子节点所用步数),当前节点走到第i个子节点用1步,第i个子节点向下走p-1步,不回来;
要么是花一步走到第i个子节点,在第i个子节点往下走p-2步,再花一步走回当前节点,再在前i-1个子节点中走j-p步(包括去和回来前面的子节点所用步数)并且不回来。
因此t[i][j][0]=max(t[i-1][j][0],max{t[i-1][j-p][1]+ans[nowson][p-1][0]},max{t[i-1][j-p][0]+ans[nowson][p-2][1]})
对于t[i][j][1],要么是前i-1个子节点共走j-p步(包括去和回来前面的子节点所用步数),走到第i个子节点花1步,第i个子节点向下走用p-2步并回来,从第i个子节点回来花一步;要么是前i-1个子节点共走j步(包括去和回来前面的子节点所用步数),回来。
因此t[i][j][1]=max(t[i-1][j][1],max{t[i-1][j-p][1]+ans[nowson][p-2][1]})
当然实际求解的时候并不需要每个节点开一个t数组,只需要在ans数组上直接做就行了。就是先对t数组求解过程用滚动数组优化,那么只需要两维t[j][0/1]。这时只需要把ans[当前节点]的数组当做t去做就行了。另外,求解t数组的边界要注意一下。另外,t数组再求解前就全部初始化成当前节点权值就行了。
最终答案很显然:max(ans[1][k][0],ans[1][k][1])。
曾经错误:
naive的转移方程:
t[i][j][0]=max(t[i-1][j][0],t[i-1][j-p][0],t[i-1][j-p][1]+ans[son][p][0])
t[i][j][1]=max(t[i-1][j][1],t[i-1][j-p][1]+ans[son][p][1])
事实上,这道题转移t[i][j][0]的第3种(标红的)情况很容易遗漏。另外,很容易忽略走去与走回子节点花费的1或2步。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Edge
{
int to,next;
}edge[];
int ne,ans[][][],f1[];
int a[];
int n,k;
bool vis[];
void dfs(int u)
{
int j,kk=f1[u],p,v;
vis[u]=true;
for(j=;j<=k;j++)
ans[u][j][]=ans[u][j][]=a[u];
while(kk!=)
{
v=edge[kk].to;
if(!vis[v])
{
dfs(v);
for(j=k;j>=;j--)
{
for(p=;p<=j;p++)
ans[u][j][]=max(ans[u][j][],max(ans[u][j-p][]+ans[v][p-][],ans[u][j-p][]+ans[v][p-][]));
for(p=;p<=j;p++)
ans[u][j][]=max(ans[u][j][],ans[u][j-p][]+ans[v][p-][]);
}
}
kk=edge[kk].next;
}
}
int main()
{
int i,ta,tb;
while(scanf("%d%d",&n,&k)==)
{
ne=;
memset(ans,,sizeof(ans));
memset(vis,,sizeof(vis));
memset(f1,,sizeof(f1));
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<n;i++)
{
scanf("%d%d",&ta,&tb);
edge[++ne].to=tb;
edge[ne].next=f1[ta];
f1[ta]=ne;
edge[++ne].to=ta;
edge[ne].next=f1[tb];
f1[tb]=ne;
}
dfs();
printf("%d\n",max(ans[][k][],ans[][k][]));
}
return ;
}
Apple Tree POJ - 2486的更多相关文章
- E - Apple Tree POJ - 2486
E - Apple Tree POJ - 2486 Wshxzt is a lovely girl. She likes apple very much. One day HX takes her t ...
- Apple Tree POJ - 2486 (树形dp)
题目链接: D - 树形dp POJ - 2486 题目大意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值 学习网址:https://blog.c ...
- Apple Tree POJ - 3321 dfs序列构造树状数组(好题)
There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...
- 【POJ 2486】 Apple Tree (树形DP)
Apple Tree Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to a ...
- 【POJ 2486】 Apple Tree(树型dp)
[POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8981 Acce ...
- POJ 2486 Apple Tree
好抽象的树形DP......... Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6411 Accepte ...
- poj 2486 Apple Tree(树形DP 状态方程有点难想)
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9808 Accepted: 3260 Descri ...
- poj 2408 Apple Tree
http://poj.org/problem?id=2486 典型的回溯题目:特别是状态方程用三维的来标记是否要走回路. 题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走 ...
- POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)
id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...
随机推荐
- Meteor表单
在本教程中,我们将告诉你如何使用 Meteor 的表单. 文本输入 首先,我们将创建一个 form 元素中文本输入字段和提交按钮. meteorApp/import/ui/meteorApp.html ...
- Feign简介
Feign简介
- win8系统 如何默认显示文件扩展名和显示隐藏文件
装一个魔方软件,然后再任意文件或者文件夹上面右击,依次点击下面两项,就可以默认显示文件扩展名和显示隐藏文件
- Hibernate4之session核心方法
在学习session的核心方法之前,我们先了解下hibernate中几种对象的状态: 暂时状态:这样的状态就好像咱们公司请的暂时员工一样,他在公司里没有相关的资料和id. 特点:在使用代理主键的情况下 ...
- redirect和rewrite
1 服务器端重定向 客户端想要访问的内容不在该服务器上,该服务器自己去另外的服务器请求到该内容,然后还是由该服务器将内容返回给客户端.称为rewrite. 2 客户端重定向 客户端想要访问的内容不在该 ...
- The uWSGI project aims at developing a full stack for building hosting services.
https://github.com/unbit/uwsgi-docs/blob/master/index.rst
- YTU 1007: Redraiment猜想
1007: Redraiment猜想 时间限制: 1000 Sec 内存限制: 10 MB 提交: 83 解决: 23 题目描述 redraiment在家极度无聊,于是找了张纸开始统计素数的个数. ...
- IOS UI 设计 技术
AutoLayout AutoLayout是一种基于约束的,描述性的布局系统. 程序员—-(cgrect)—>frame(center+bounds) =====> 程序员—(N ...
- html5--switch选择结构的优化
html5--switch选择结构的优化 问题: 使用循环语句判断月份是31天还是30天 两点提示: 使用switch多条件判断语句 合理的省略break优化代码 <!DOCTYPE html& ...
- HDU - 4333 Revolving Digits(拓展kmp+最小循环节)
1.给一个数字字符串s,可以把它的最后一个字符放到最前面变为另一个数字,直到又变为原来的s.求这个过程中比原来的数字小的.相等的.大的数字各有多少. 例如:字符串123,变换过程:123 -> ...