动态DP细谈
动态DP
- 动态DP本质就是普通树形DP变成在树上进行丧心病狂的修改权值,而这类问题往往可能每次都需要每次修改后再去DP一遍,这样就造成时间复杂度巨大无比,那么我们就可以很 (时) 自 (间) 然 (巨) 地 (大) 引出新算法------>动态DP.
- 自己分的觉得动态DP可以分成两类题型,一种我叫树形动态DP,另一种叫线性动态DP。我自认为树形动态DP比较人性化 (用的东西更人性) 。
树形动态DP
- 首先这一类问题往往是在树上去找几个点去求某些值,而他修改的内容也是几个点权值的修改,而如果每次修改我们就重新算树形DP,无疑时间巨大。而这类通常修改次数不多,只是每次修改几个点(可以区别于我后面要讲的线性动态DP)。
- 树形动态DP解决这类问题通常采用 (虚树+树形DP):因为我们每次修改的点并不会影响其他点,那我们可以在原来的树上,建立一个新的树—>虚树,虚树就只保存我们需要的关键点,那DP的时间就降下来了,而且因为我们后面用了树形DP,其关键点的最近公共祖先也应该为关键点,保存在虚树里。
主要解决步骤
- 虚树的解决
因为虚树要保存关键字及其最近公共祖先,我们需要现在原图上保存每一个点的dfs顺序,然后按着dfs顺序去找,我们就假设此时虚树中左侧的点已经全部处理好了,那我们就要去可以用一个栈去保存此时的分界线即当前处理的链,如果now点不属于当前sta的顶上点的子树,那么就需要给所有左边的点加入虚树边,再将lca与now加入sta,最后再将sta里面剩余便挨着挨进行建边,那么就建立好虚树。
2.树形DP
把虚树建立好后,那求结果就很好了,再虚树上进行树形DP即可。
---------------------------------------------//等待下期更新