树形dp简单总结

最近几天一直在做树形dp的题,感觉是有点儿虐。。做了十几道,有很简单的 树的最大独立集,树的重心和树的最长路径,还有树的依赖背包问题以及一些比较复杂的状态转移。

最简单的几道题:Party at Hali-Bula(树的最大独立集),最优联通子集,computer(求各个点的最长路径,就是进行多次dfs,求一个树中的最长路径有两种方法要掌握),balancing act(求一颗树的重心)

然后就是树上的依赖背包问题,树的泛化背包实际上就是对它的每一个子节点枚举一个容量,将所有的这些子集情况总结起来找出答案。像 the more,the better , rebuilding roads , starship troopers(要理解好树上的泛化背包,就是在枚举子节点的不同状态,这个题因为士兵不能往回走,所以即使当一个room里敌人的数量为0,如果要访问这个结点也必须要分配至少一个士兵到这条支路,因此子节点的状态必须是从1开始,而不是从0开始,表明要么不分配给此路士兵,要么就至少一个) 。有一个比较经典的树形依赖背包的快速算法O(n*c),详见The most powerful force。这个算法实际上就是在多次进行一个物品与一个泛化背包的合并,画出一个流程图就可以明白它的过程。当然并不是所有的树形依赖背包的都可以。

其实以上都是树形dp需要的基础东西,万变不离其宗,剩下的树形dp复杂问题就是在此基础上的变形和应用,深深体会到最重要的是分析题目的过程,通过几道题我有了这么几个解决问题的方向:  首先根据问题的类型和规模灯的确定问题的基本方向,比如说是树形dp类,当然可能会是多种问题结合起来的,不过总是会有一个问题的中心思想,其它的都是围绕着它来展开的;    接下来最重要的就是将问题进行合理的转化和分解,说起来挺空,要通过具体的例子来逐步体会,千万不要读完之后将所有的问题一股脑都堆积起来,瞬间就懵了。而对于dp来说最重要的就是如何找到状态的转移,动归即递归,所以分成两部分:确定边界条件和转移方程。找转移方程要看当前状态都与哪些和哪样的状态有联系,据此来确定状态的维度,一个状态表示不了就加状态,当然一般来说维度少点儿最好。

不过我现在的水平来说,这些题确实挺难的,毕竟做的题目少了,做了三道题目,有一道 information disturbing,是先二分答案再进行简单的树形dp,现在看来还可以,但是当初做的时候却想不到,光在想“单纯”的树形dp,所以做题思路不要太拘谨,要想如何将大问题分解成一个个的子问题。还有两道game 和 appleman and tree.

总之dp的东西一定要多做题,深刻的体会转移方程是如何得来的,平时不应仅仅局限在代码上,要多自己独立思考,尽量少看题解。平时想问题的时候一定要集中一点,不要光走神,提高效率. Fighting for us, fighting for me !

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值