其他分享
首页 > 其他分享> > 「刷题笔记」DP优化-数据结构优化

「刷题笔记」DP优化-数据结构优化

作者:互联网

补大半年以前留的坑发现这块没咋做过然后博客也莫名其妙的咕了……
所以之前考试遇到个DS优化的题就只能阿巴阿巴阿巴阿巴……

树上 LIS & LDS

例题:[FJOI2018]领导集团问题 & bzoj4919
如果是一个数列,求 \(\text{lis/lds}\) 就是一个二分然后插入的过程,
那么在树上,一个父节点有许多子节点时,子节点之间互不影响,那么可以用线段树合并来解决这个问题
首先需要将权值离散,
每个节点维护一棵权值线段树,线段树的叶子,下标为 \(\text{i}\) 代表从权值 \(\text{i}\) 开始最长 \(\text{lis}\) 的长度,\(\text{dfs}\) 时,先把子树信息合并好,接下来考虑如何把当前节点塞进去
那么当前节点接在第一个比他大的数后面,可以得到新的长度,用这个长度来更新一段区间的答案,因为根据我们的规定,这个 \(\text{lis}\) 的长度随 \(\text{i}\) 的上升是不上升的,那么可以二分来求出能更新答案的区间
需要支持线段树上的单点修改,单点求值,一个技巧是标记永久化,修改时对于在区间内的节点直接打标记 \(\text{return}\),询问时一路加标记即可
如果是求 \(\text{lds}\) 就也是同一个逻辑了
如果题中上升和下降不是严格的,就是在找接上的长度的时候,不是找 \(\text{w+1/w-1}\) 的长度,而是找 \(\text{w}\) 的长度即可

dp转移优化

例题:[ZJOI2010]基站选址
设 \(f[i][k]\) 为第 \(i\) 个位置放第 \(k\) 个基站,「且不考虑之后怎么放」的最小代价,\(w[a][b]\) 为 \([a,b]\) 内不建基站会造成的代价,则可以写出转移方程:

\[f[i][k]=min(f[j][k-1]+w[j][i]) (j<i) \]

首先可以滚掉 \(k\) 这一维:

\[f[i]=min(f[j]+w[j][i])+c[i] (j<i) \]

现在主要需要解决的问题就是 \(w[j][i]\) 怎么求,考虑我们在 \(i\) 这个位置不放基站,且能覆盖地区 \(k\) 的最右位置为 \(i\),
那么能覆盖 \(k\) 的最左位置 \(j\) 以左(不包含 \(j\))的转移点在转移时就会多一个不能覆盖 \(k\) 的代价 \(c[k]\)
(因为设的状态是当前点放基站的答案,所以只有 \(i\) 之后能确定 \(k\) 不能被覆盖了)
那么枚举当前状态时,先考虑建基站的情况,求之前的转移点中最小的值,再更新这个点不建基站对之后转移造成的影响
即为区间最值,区间修改两个操作,可以用线段树辅助解决
注意预处理 \(f[i][1]\) 的值,能被覆盖的左右边界可以二分求出,实际上最优方案不一定出现在 \(n\) 处,可以新建一个对答案不影响的虚拟位置,最后查这个位置的答案即可(不能一边求一边更新,因为此时的值「不考虑之后怎么放」)

标签:text,线段,阿巴,基站,长度,优化,节点,DP,刷题
来源: https://www.cnblogs.com/zzzuozhe-gjy/p/14355956.html