题目大概是一棵树,每个结点都有若干个苹果,求从结点1出发最多走k步最多能得到多少个苹果。

考虑到结点可以重复走,容易想到这么个状态:

  • dp[u][k][0]表示在以结点u为根的子树中走k步且必须返回u能得到的最多苹果
  • dp[u][k][1]表示在以结点u为根的子树中走k步且可以不返回u能得到的最多苹果
  • 单纯这样转移又是指数级的时间复杂度,所以又是树上背包了

转移就是:

  • dp[u][k][0]=max(dp[u][k][0],dp[v][k'][0]+dp[u][k-k'-2][0])(v是u当前的孩子),对于必须返回的就是从u走一步到v,分k‘个给当前的子树v走并走回v,最后再走一步返回u
  • dp[u][k][1]=max(dp[u][k][1],dp[v][k'][1]+dp[u][k-k'-1][0])(v是u当前的孩子),之前的子树走完回到u,走一步到v,最后不返回地在当前的子树v中走k‘步

不过这样提交WA。。然而看不出哪里有错。。无奈看别人代码,发现转移少考虑了一种情况——

  • dp[u][k][1]=max(dp[u][k][1],dp[v][k'][0]+dp[u][k-k'-2][1])(v是u当前的孩子),从u走一步到v,分配k'步给当前子树v走并返回v,再走一步回到u,最后不返回地向之前的子树走

真的想不到。。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 111
struct Edge{
int v,next;
}edge[MAXN<<];
int NE,head[MAXN];
void addEdge(int u,int v){
edge[NE].v=v; edge[NE].next=head[u];
head[u]=NE++;
}
int d[MAXN][][];
int n,m,apple[MAXN];
void dp(int u,int fa){
d[u][][]=d[u][][]=apple[u];
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
if(v==fa) continue;
dp(v,u);
for(int j=m; j>; --j){
for(int k=; k<j; ++k){
if(d[v][k][]==- || d[u][j-k-][]==-) continue;
d[u][j][]=max(d[u][j][],d[v][k][]+d[u][j-k-][]);
}
for(int k=; k<j-; ++k){
if(d[v][k][]==- || d[u][j-k-][]==-) continue;
d[u][j][]=max(d[u][j][],d[v][k][]+d[u][j-k-][]);
}
for(int k=; k<j-; ++k){
if(d[v][k][]==- || d[u][j-k-][]==-) continue;
d[u][j][]=max(d[u][j][],d[v][k][]+d[u][j-k-][]);
}
}
}
}
int main(){
int a,b;
while(~scanf("%d%d",&n,&m)){
NE=;
memset(head,-,sizeof(head));
for(int i=; i<=n; ++i) scanf("%d",apple+i);
for(int i=; i<n; ++i){
scanf("%d%d",&a,&b);
addEdge(a,b); addEdge(b,a);
}
memset(d,-,sizeof(d));
dp(,);
int res=-;
for(int i=; i<=m; ++i){
res=max(res,d[][i][]);
}
printf("%d\n",res);
}
return ;
}

POJ2486 Apple Tree(树形DP)的更多相关文章

  1. POJ2486 - Apple Tree(树形DP)

    题目大意 给定一棵n个结点的树,每个结点上有一定数量的苹果,你可以从结点1开始走k步(从某个结点走到相邻的结点算一步),经过的结点上的苹果都可以吃掉,问你最多能够吃到多少苹果? 题解 蛋疼的问题就是可 ...

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

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

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

  4. POJ 2486 Apple Tree(树形DP)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

  5. URAL_1018 Binary Apple Tree 树形DP+背包

    这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...

  6. Ural-1018 Binary Apple Tree(树形dp+分组背包)

    #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #i ...

  7. POJ 2486 Apple Tree (树形dp 经典题)

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const ...

  8. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  9. poj2486 Apple Tree (树形dp+分组背包)

    题目链接:https://vjudge.net/problem/POJ-2486 题意:一棵点权树,起点在1,求最多经过m条边的最大点权和. 思路: 树形dp经典题.用3维状态,dp[u][j][0/ ...

随机推荐

  1. [Effective JavaScript 笔记] 第6条:了解分号插入的局限

    分号可以省略 js可以在语句结束不强制加分号.(建议还是添加,不添加分号往往会出现不易发现的BUG) function Point(x,y){ this.x=x||0; this.y=y||0; } ...

  2. RHEL6.2下挂载光驱安装软件

    导读 在RHEL6.2命令行模式下挂载虚拟光驱安装软件也许会难倒许多新手,下面我给大家详细介绍一下.首先说明一下,本教程是以RHEL6.2版本下安装Apache为例.主要讲述挂载虚拟光驱的方法.环境: ...

  3. Windows/Centos安装GO语言环境

    转载:http://www.haiyun.me/archives/1009.html Centos下使用epel源安装: 1 yum install golang Centos/Linux下源码安装g ...

  4. linux rsync +inotify 实现 实时同步

    前言:     rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rs ...

  5. PHPNG (next generation)

    PHPNG (next generation) This page gives short information about development state of a new PHP branc ...

  6. vs2013秘钥

    Ultimate:BWG7X-J98B3-W34RT-33B3R-JVYW9 Premium:FBJVC-3CMTX-D8DVP-RTQCT-92494  YKCW6-BPFPF-BT8C9-7DCT ...

  7. Kmin

    Kmin of Array [本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array.html [代码]  C++ Code  12345678 ...

  8. Java for LeetCode 028 Implement strStr()

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  9. UESTC 1215 (思维题 旋转)

    Secrete Master Plan Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Othe ...

  10. osg事件处理器osgGA::GUIEventHandler handle

    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { osgViewer::View ...