dp的单调队列优化

dp的单调队列优化

dp的单调队列优化

解题流程

适用于状态转移方程中含有区间最值操作的优化方法,只要能够快速得求出一段区间的最值,那么就可以快速得尽兴状态转移,然后就可以达到优化dp状态转移时产生的时间复杂度。众所周知,单调队列可以O(1)O(1)求解区间最值问题,那么通过单调队列维护dp值就可以将原本状态转移时的时间复杂度从O(n)O(n)降低至O(1)O(1)

多重背包的单调队列优化

易得一般形式中的状态转移方程为dp[i][j]=max(dp[i1][jwik]+kvi)dp[i][j]=max(dp[i-1][j-wi*k]+k*vi) (0<=k<=ki)(0<=k<=ki)

通过枚举每一个物品不能刚好放下的剩余空间,将dp[i][j]dp[i][j]化成g[x][y]=dp[i][xwi+y]g[x][y]=dp[i][x*wi+y] ,g[x][y]=dp[i1][xwi+y]g'[x][y]=dp[i-1][x*wi+y],通过枚举每一个yy来枚举所有的状态。然后通过令G[x][y]=g[x][y+xwi]wixG[x][y] =g'[x][y+x*wi]-wi*x来消去状态转移方程中的kk

然后就有状态转移方程g[x][y]=max(G[xk][y])+vixg[x][y]=max(G[x-k][y])+vi*x这样就可以用单调队列来维护G[xk][y]G[x-k][y]就可以将g[x][y]g[x][y]O(1)O(1)的时间内转移出来,然后就把复杂度从O(nm2)O(n*m^2)转移到了$O(n*
m) $。

例题:1. P1776宝物筛选


dp的单调队列优化
https://mrxyan6.github.io/2022/09/04/dp-slide-window/
作者
mrx
发布于
2022年9月4日
许可协议