动态DP

动态DP

最大子段和

考虑设\(f_i\)表示以i为结尾的最大子段和,\(g_i\)表示i以内的最大子段和

\[f_i=\max(f_{i-1}+a_i,a_i) \]

\[g_i=\max(g_{i-1},f_i) \]

然后非常容易将每个权值变成一个矩阵,然后每次修改就变成修改一个矩阵

用线段树维护即可

树上最大独立集(没有上司的舞会带修)

考虑基础的做法,设\(f_{i,0/1}\)表示以i为根的子树中,i放/不放的最大独立集

\[f_{i,0}=\sum_{son}\max(f_{son,0},f_{son,1}) \]

\[f_{i,1}=\sum_{son}f_{son,0} \]

然后考虑带修,想到树剖

然后就可以再设\(f_{i,0/1}\)表示以i为根的子树(不包括i的重儿子)中,i放/不放的最大独立集

\[g_{i,0}=\sum_{son\in light}\max(g_{son,0},g_{son,1}) \]

\[g_{i,1}=\sum_{son\in light}f_{son,0} \]

image-20230113144620492

然后为什么要把矩阵立起来?考虑到树剖的dfn序在链中,是上到下升序,so要倒过来(自行理解)

然后就可以简单的解决,因为修改时一个重链中的矩阵不会相互影响(g的DP转移式中可以看出)

时间复杂度\(O(q\log^2N)\)

posted @ 2024-02-22 20:47  zhy_learn  阅读(9)  评论(0编辑  收藏  举报