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的更多相关文章

  1. 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 ...

  2. Apple Tree POJ - 2486 (树形dp)

    题目链接: D - 树形dp  POJ - 2486 题目大意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值 学习网址:https://blog.c ...

  3. 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. ...

  4. 【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 ...

  5. 【POJ 2486】 Apple Tree(树型dp)

    [POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Acce ...

  6. POJ 2486 Apple Tree

    好抽象的树形DP......... Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6411 Accepte ...

  7. poj 2486 Apple Tree(树形DP 状态方程有点难想)

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9808   Accepted: 3260 Descri ...

  8. poj 2408 Apple Tree

    http://poj.org/problem?id=2486 典型的回溯题目:特别是状态方程用三维的来标记是否要走回路. 题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走 ...

  9. POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)

    id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...

随机推荐

  1. SQLAlchemy的group_by和order_by的区别

    1.官网解释: group_by(*criterion) apply one or more GROUP BY criterion to the query and return the newly ...

  2. OPENWRT安装Python到U盘

    http://www.zcilxl.com/tech/23.html 研究了一下如何将软件安装在OPENWRT挂载的U盘上,以Python为例,把过程记录一下. 安装的前提是你的USB设备已经成功挂载 ...

  3. 深入浅出AOP(一)

    动态代理实现AOP: AOP事实上非常早之前依照做出来了一些东西,之所以不敢说做出来了.是由于它是什么?怎么实现?做出来的东西是不是?先前一直查资料.查到的资料跟着做.到后来发现,AOP越来越大,而非 ...

  4. 网络知识: 物理层PHY 和 网络层MAC

    PHY模块简介 物理层位于OSI最底层,物理层协议定义电气信号.线的状态.时钟要求.数据编码和数据传输用的连接器. 物理层的器件称为PHY. 上图里的灰色方框图里的就是PHY芯片内部模块图. MAC器 ...

  5. Unity即将到来的2D工具

    孙广东  2015.7.5 看了一下对功能介绍的视频,确实功能强大. 可是须要FQ在youtube上观看,所以就下载下来了.能够浏览一下: http://www.iqiyi.com/playlist2 ...

  6. BZOJ 2460: [BeiJing2011]元素 线性基

    2460: [BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力 ...

  7. SSH三大框架整合配置详细步骤(3)

    5 配置Spring2.5 5.1 基础配置 1)        导入spring包.下载spring-framework-2.5.6并解压后,在spring-framework-2.5.6" ...

  8. ALLOWED_HOSTS = ['*']

    https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-ALLOWED_HOSTS https://stackoverflow ...

  9. 借助ltp语义分析提取特征,之后,文本生成

    """地点-哪里有做-业务-的(正规|靠谱)-公司?地点-做-业务-的(正规|靠谱)-公司(有哪些?|的联系方式是什么?|哪家口碑好值得信赖?)地点-做-业务-(怎么能省 ...

  10. POJ3692 Kindergarten —— 二分图最大团

    题目链接:http://poj.org/problem?id=3692 Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...