数据结构优化DP

有些时候状态转移的时候一堆候选决策不知道怎么办?
使用循环?会T飞的!
维护决策单调性?会出错的!
倍增/状压?离正解远了!
剩下的只有这一个优化方式了:

数据结构优化DP

有些决策暴力查询复杂度很炸,不过放到数据结构题就是板子
这个时候,我们就可以写一个数据结构,查询决策就相当于查询
这样的话查询决策的开销就可以降低了!

来几个题?

AHOI2006 基因匹配

这个题60部分分给到的是O(n2)的LCSDP
考虑优化一下下:
f[i][j]=max(f[i1][j],f[i][j1],f[i1][j1]+(a[i]==b[j]))
这里给到的每个数出现5次是关键特殊性质,
记录每个i在a的位置,对于b来说这几个位置是发生转移的位置
在b中,状态转移方程就变成了:
f[pos[x][j]]=max(f[i]+1),i[1,pos[x][j]1]
这里就可以用维护区间最值的数据结构维护了
特殊性质:i[1,x],xZ,树状数组搞一下就行
直接压到O(nlogn)

USACO Cleaning Shifts

线段覆盖问题上数据结构优化
状态转移方程:
f[r]=min(f[r],min(f[x]+w)),x[l1,r]
快速维护min(f[x])+w,这里手段就很多了
线段树维护区间最值

NOI1998 免费馅饼

加强版 N=1e5

状态转移方程很好列:
f[i]=max(f[i],f[j]+1),j,|PiPj|[0,2(titj)]
但是暴力转移是O(n2)的,N=1e5
考虑优化
状态干不动,决策干不动,转移条件?
拆成一个不等式组
{pi2ti<pj2tj,pi<pjpi+2ti>pj+2tj,pi>pj
然后按第一个式子升序,第二个开树状数组维护就行了

独特序列

就是树状数组维护前缀和这种东西
首先推个计数方程
首先就是把所有的序列都在后边插上一个ai
然后会发现,就是在上一个ai出现的位置(记为lastai)之前的会算重,扣掉即可
于是我们上树状数组维护前缀和
考虑修改lastai位置的情况防止算重
我们需要把这个位置减掉(它的前缀和减掉它前面的前缀和)
这样在扣掉lastai以前的位置的时候,我们由于这个位置还有前面的东西算上
然后只是扣掉了lastai的影响,就不重不漏了

posted @   2K22  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示