题意:
给一个具有n个节点的树,每个节点上有一个值v,现在从节点1开始,走L步,问L步中经过的v值之和最大为多少。若一个点被重复走过,这个权值只计算一次。
范围:
1<n<=50,0<=L<=100,0<=v<=100。
树形DP解决,状态分析:
dp[u][1][step]:表示从节点u开始,走step步,此时回到u点,经过的点的最大权值之和。
dp[u][0][step]:表示从节点u开始,走step步,此时没有回到u点,经过的点的最大权值之和。
状态转移:
走step步回到u点,只有一种转移方法:child表示当前的子树,我们都从当前子树考虑,若能转移,当前子树也必须回到child点。所以转移方程为:
dp[u][1][step]=max(dp[u][1][step],dp[u][1][i]+dp[child][1][step-i-2]):dp[u][1][i]从前面的几个孩子求得的值,dp[child][1][step-i-2]当前孩子必须回到child点,-2表示u->child的边,来回的步数。
走step步没有回到u点,有两种转移方法:也是从当前子树考虑。若能转移,可以有两种情况:
①当前子树回到child点,前面考虑的子树没有回到u点;
dp[u][0][step]=max(dp[u][0][step]ÿ