Link
被这道题前前后后克了10h。 我也实在不想回头看这道题目了 但是为了让这10h有意义 我还是硬着头皮写点东西吧。
Solution
树形DP
最暴力的状态是表示在以为根的子树中,的父节点至少安装个,安装了个,的子节点安装了个的最小代价。
优化一下,拆成三个
表示在以为根的子树中,表示不安装,的子节点安装了个的最小代价
表示安装了个的最小代价
表示不安装,需要父节点安装至少个的最小代价
在DP中,还需要一个辅助的状态,表示在以为根的子树中,不安装,的子节点安装了个,父节点安装了个的最小代价
显然
然后剩下的问题就是转移了
要用每个子节点优化,在寻找最优方案的过程中不能把原数组覆盖,要在一个中计算,最后再过去。
所以转移就两种情况:
1.让子节点多安装
2.让父节点多安装。
那就枚举每个状态,枚举——需要多安装几个
第一个转移里面的很显然:一个点安装两个以上是完全意义不明的
第二个转移的含义相当于多选了孙子节点,就需要多选父节点——根据题意可以感受一下。至于第二个里面的,考虑一下的肯定是需要的,否则肯定是不合法的状态。这样做就可以使得合法的值不会进入不合法的状态。好吧其实我也搞不清楚为什么
只是为了让这个状态在增加了一个子树之后变得合法。
Tips
一开始想DP每个点到父节点的连边的代价,导致非常麻烦 费力写出来之后发现有些情况没有考虑 唉还能说什么呢人太弱只能被虐 以后还是慎重考虑在树形DP中DP点到父节点的值吧 花这么久也是醉了 也许以后被克许久之后应该早点看题解?
Code
1 |
|