hdu 4003 Find Metal Mineral (树形背包dp)

来源:互联网 发布:t3利润表本月没有数据 编辑:程序博客网 时间:2024/04/25 03:50


本文出自   http://blog.csdn.net/shuangde800



题目链接:  hdu-4003 


题意

    给一棵n个节点的树, 节点编号为1~n, 每条边都有一个花费值. 
    有k个机器人从S点出发, 问让机器人遍历所有边,最少花费值多少?


思路

    很好的一题, 推荐!

    前天看的这题, 今天才想出来的. 方法想出来后,代码很简单
    最近做的几道dp,都是一开始没什么想法,然后过两天再想就想出来了,也许是因为人的潜意识其实会一直在想某个问题

    翻看一下网上其他人的做法, 和我的稍有不同, 他们是用f(i, j)表示子树i用j个机器人的最少花费, 一开始我也是这样
    去想,但是没想到怎么去状态转移.

    然后我换了一种思路,很快就想出来了

    如果从根节点出发,遍历所有节点之后再回到原点, 那么最少的花费一定是所有边的权值之和sum的两倍, 因为每条边都走了两次.

    而这题, 遍历完之后,并不需要走回出发点, 所以, 有些边只走了一次就可以了,
    如果用1台机器人走, 最少的的花费 = sum * 2 - {根节点到叶子节点路径的最大权值和}
    如果是j台机器走, 我们要让j台机器人只走一次的边的权值之和尽量大, 也就是减少的花费尽量大.

    那么, 我的状态表示为:
    f(i, j) 表示子树i用j个机器人最多可以减少的花费.
    
    对于i节点, 它的每个子节点的子树是一组物品, 我们可以选择派1,2,...j个机器人走去
    需要注意, 如果派x个机器人走向某个子节点v, 那么边edge(i, v)就会被走了x次, 花费了x*w(i, v).
    而原始的sum中每条边只走了两次, 所以走edge(i, v)的花费减少了 2*w(i,v) - x*w(i,v)

    最后可以得到状态转移式:

    f(i, j) = max{ max{f(i, j-k) + f(v, k) + 2*w(i,v) - k*w(i,v) | 1<=k<=j }  | v是i的儿子节点 }
    
    最终答案ans = sum * 2 - f(s, k)



代码 









原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新买的电动自行车不符合标准怎么办 电费的户号12位怎么办? 买到过期的药品怎么办 淘宝代销宝贝信息不全怎么办 en和eng读不明显怎么办 快递收件人填错手机号没收到怎么办 快递收件人电话写错了怎么办 收件人电话写错了怎么办 大货要出货了数量错误怎么办 手被烫伤留疤怎么办 cbg被下单不能改价怎么办 浪琴手表日期中午跳怎么办 社保一体卡丢失了怎么办 京东付款七天不发货怎么办 电动车电机锁钥匙丢了怎么办 电瓶车锁钥匙丢了怎么办 苹果平板ld忘了怎么办 平板版本太低6.0怎么办 ios平板版本太低怎么办 微信公众号重名怎么办 发票规格型号填错了怎么办 鲁大师检测硬盘有问题怎么办 英文成绩单翻译错了怎么办 川航订机票名字写错了怎么办 亚航电子登机牌没有保存怎么办 cfa考试准考证名字有错怎么办 火车票护照号错了怎么办 国际机票名字错一个字怎么办 国际机票名字拼音错了怎么办 订机票名字写错了怎么办 亚航机票护照号写错怎么办 打发过了的奶油怎么办? 孩子生了没人带怎么办 办理退休审核未通过怎么办 整天沉迷全民k歌怎么办 吃鸡账号被误封了怎么办 手机换号了银行卡怎么办 评副高没有病房论文怎么办 收件人姓名写错了怎么办 汇款姓名写错了怎么办 在菲律宾旅游签证过期怎么办