Topcoder SRM666 DIV2第三题,树形DP

题意:

给一个具有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]ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值