poj 2486 Apple Tree 树形DP,树形背包
2012-09-12 10:59
351 查看
题意:一个树形结构中,每个节点都有权值,从点1 开始漫游,在最多走K步的情况下,问可得到的最大收益。
做法:或许DP考的就是状态分割和把具体状态用数据结构压缩表示的能力。因为是树的结构,所以每个节点有两种状态:经过之后一去不回,经过之后在回来。分别用0表示回来,1表示不回来。有一个贪心条件:在走过的步相同的条件下,回到原节点得到的利益<=不回到原节点的价值。
听说还有另一种方法,学习中。。。
做法:或许DP考的就是状态分割和把具体状态用数据结构压缩表示的能力。因为是树的结构,所以每个节点有两种状态:经过之后一去不回,经过之后在回来。分别用0表示回来,1表示不回来。有一个贪心条件:在走过的步相同的条件下,回到原节点得到的利益<=不回到原节点的价值。
听说还有另一种方法,学习中。。。
#include<stdio.h> #include<string.h> #define LMT 105 /*强大的状态设计*/ /*求最优的题中,走回头路的次数也是被限制的*/ //树的“回路”肯定是一环套一环。 //自己手动模拟一下回路状态。 //每一个点的回路插入次序可任意 typedef struct { int u,v,next; }line; line e[LMT<<1]; int dp[LMT][205][2],wei[LMT],next[LMT]; int all,n,step; inline int max(int a,int b) { return a>b?a:b; } void insert(int u,int v) { e[all].u=u; e[all].v=v; e[all].next=next[u]; next[u]=all++; e[all].v=u; e[all].u=v; e[all].next=next[v]; next[v]=all++; } void dfs(int u,int pre) { for(int i=0;i<=step;i++)//可以原地踏步浪费(只是为了形象。。。,多数情况下这种表示法不易遗漏状态,所以一旦证明可行就用) dp[u][i][0]=dp[u][i][1]=wei[u]; int v,x,j,k; for(x=next[u];x!=-1;x=e[x].next) if(e[x].v!=pre) { v=e[x].v; dfs(v,u); for(j=step;j>=1;j--) for(k=1;k<=j;k++) { dp[u][j][1]=max(dp[u][j][1],dp[u][j-k][0]+dp[v][k-1][1]); if(k%2==0) { dp[u][j][1]=max(dp[u][j][1],dp[u][j-k][1]+dp[v][k-2][0]);//这里充分体现那个贪心而引发的trick dp[u][j][0]=max(dp[u][j][0],dp[u][j-k][0]+dp[v][k-2][0]); } } } } int main() { int i; while(scanf("%d%d",&n,&step)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&wei[i]); memset(next,-1,sizeof(next)); all=0; for(i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); insert(u,v); } dfs(1,0); printf("%d\n",dp[1][step][1]); } return 0; }
相关文章推荐
- POJ 2486 树形背包DP Apple Tree
- POJ 2486 Apple Tree (树形DP,树形背包)
- poj 2486 Apple Tree (树形背包dp)
- poj2486 Apple Tree 树形dp背包
- poj 2486 Apple Tree(树形DP 状态方程有点难想)
- POJ 2486 Apple Tree (树形dp 经典题)
- poj 2486 Apple Tree(树形DP,状态好纠结。。。)
- POJ 2486 Apple Tree 树形dp+背包
- poj 2486 Apple Tree(树形dp)
- poj 2486 apple tree 树形DP 不懂的一定把你讲懂
- poj_2486 Apple Tree(树形dp)
- POJ-2486 Apple Tree 树形DP
- poj 2486 Apple Tree (带回溯的树形dp)
- [树形dp] poj 2486 Apple Tree
- POJ 2486 Apple Tree 树形DP
- poj 2486 apple tree(树形DP)
- POJ 2486 Apple Tree 树形DP
- POJ - 2486 Apple Tree(树形DP)
- poj 2486 Apple Tree (树形背包dp)
- POJ 2486 Apple Tree (树形DP)