dp优化总结

Posted sillytiet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dp优化总结相关的知识,希望对你有一定的参考价值。

dp优化总结

一、滚动数组

典型的空间优化。

这应该是最最普通的一个优化了吧。。

对于某些状态转移第i个只需要用到第i-1个状态时,就可以用滚动数组,把第一维用0/1表示。

拓展1:

当一个状态转移要用到前m个转移时,我们依然可以滚起来,把第一维按模m的值滚起来。

拓展2:

若每一个决策可以选任意次(在一定限度下),那么我们可以借鉴完全背包的思路,把决策一个一个累计起来,起到优化时间的作用。(例题:NOIP2013 飞扬的小鸟

二、数据结构优化

1.单调队列

如果一个转移方程模型大致如下:

\\(dp[i]=max\\dp[i-1],dp[i-2],\\cdots ,dp[i-m]\\\\)

如果我们枚举m,显然这会非常浪费时间,那么我们可以把这m个值压入到一个单调队列中,每次弹出最大值,这样就可以做到\\(O(1)\\)更新。

2.线段树/树状数组

如果一个转移方程模型大致如下:

\\(dp[i]=max\\dp[j]\\j \\in [i-L_i,i-1]\\)其中,每个 \\(L_i\\) 不一定相同,那么显然单调队列就无法做到这点了,于是我们就需要用到线段树来维护\\(dp\\)数组的最大值,可以做到\\(O(log n)\\)更新。

当然,如果题目需要,我们还可以在线段树增加区间更新操作。(例题:ZJOI2010 基站选址 解析

三、决策单调性优化

如果一个转移方程模型大致如下:

\\(dp[i]=max\\dp[i-1],dp[i-2],\\cdots,dp[i-m]\\\\)\\(dp\\)数组中的值呈现单调性,那么我们可以直接在\\(O(1)\\)的时间内找出最值,进行更新。(这个跟单调队列有点类似)(例题:牛客网2019 Day4 T2 卖羊驼 解析

拓展1:斜率优化

拓展2:排序优化

如果某个状态值与物品放置顺序无关,只与其内部的某些值有关,当这些值涉及到两个或以上时,如果直接存入状态中,显然会MLE,同时可能还会TLE

那么,我们可以将物品按照某个值排个序,这样对于该值,决策时就会具有单调性,于是状态就可以少很多(例题:SHOI2006 书柜的尺寸 解析

以上是关于dp优化总结的主要内容,如果未能解决你的问题,请参考以下文章

斜率优化总结

总结DP优化

dp 单调性优化总结

斜率优化(DP)

决策单调性优化dp 专题练习

6. 动态规划