题目大意:一颗树n个结点,n-1条边,每个结点有不同个数的苹果,在只能走V步(即经过V条边)的前提下,问从结点1出发最多能吃到多少苹果
输入:n V(1<=n<=100,0<=V<=200)(结点符号为1 2 ...)
结点i的苹果个数(n个数,之间有空格)
结点i 结点j(表示ij之间有一条边)(有n-1行)
输出:吃到的最多苹果个数
分析:树形动态规划,相当于一个背包问题,能走的步数相当于背包容量,每个结点有多少苹果相当于价值。
状态:dp[0][s][j]表示以s为根的子树上走j步,最终回到s所得的最大价值
dp[1][s][j]表示以s为根的子树上走j步,最终不回到s所得的最大价值
结果:dp[1][1][V]
状态转移方程:从s点出发有三种决策(t为s的其中一个孩子)
①最终状态回到s点:s到t,遍历完t子树,从t返回回到s。
dp[0][s][j+2]=max{dp[0][s][j+2],dp[0][t][k]+dp[0][s][j-k]}
s->t,t->s多出两步 分配给t子树k步 剩下的j-k步给s的其他子树
②最终状态在s的其他子树待着:s到t,遍历完t子树,从t返回经过s走向s的其他子树
dp[1][s][j+2]=max{dp[1][s][j+2],dp[0][t][k]+dp[1][s][j-k]}
③最终状态在t子树上待着:s到其他子树,遍历完这些子树后返回,经过s走向t,不返回t
dp[1][s][j+1]=max{dp[1][s][j+1],dp[0][s][j-k]+dp[1][t][k]}
代码:转载自http://www.cnblogs.com/wuyiqi/archive/2012/01/09/2316758.html