典型的空間優化。
這應該是最最普通的乙個優化了吧。。
對於某些狀態轉移第i個只需要用到第i-1個狀態時,就可以用滾動陣列,把第一維用0/1表示。
拓展1:
當乙個狀態轉移要用到前m個轉移時,我們依然可以滾起來,把第一維按模m的值滾起來。
拓展2:
若每乙個決策可以選任意次(在一定限度下),那麼我們可以借鑑完全揹包的思路,把決策乙個乙個累計起來,起到優化時間的作用。(例題:noip2013 飛揚的小鳥)
1.單調佇列
如果乙個轉移方程模型大致如下:
\(dp[i]=max\\)
如果我們列舉m,顯然這會非常浪費時間,那麼我們可以把這m個值壓入到乙個單調佇列中,每次彈出最大值,這樣就可以做到\(o(1)\)更新。
2.線段樹/樹狀陣列
如果乙個轉移方程模型大致如下:
\(dp[i]=max\j \in [i-l_i,i-1]\)其中,每個 \(l_i\) 不一定相同,那麼顯然單調佇列就無法做到這點了,於是我們就需要用到線段樹來維護\(dp\)陣列的最大值,可以做到\(o(log n)\)更新。
解析)如果乙個轉移方程模型大致如下:
\(dp[i]=max\\)且\(dp\)陣列中的值呈現單調性,那麼我們可以直接在\(o(1)\)的時間內找出最值,進行更新。(這個跟單調佇列有點類似)(例題:牛客網2019 day4 t2 賣羊駝
解析)拓展1:斜率優化
拓展2:排序優化
如果某個狀態值與物品放置順序無關,只與其內部的某些值有關,當這些值涉及到兩個或以上時,如果直接存入狀態中,顯然會mle,同時可能還會tle
那麼,我們可以將物品按照某個值排個序,這樣對於該值,決策時就會具有單調性,於是狀態就可以少很多(例題:shoi2006 書櫃的尺寸
解析)
斜率優化dp總結
本篇部落格主要講的是斜率優化一些最基礎的定義以及做法,高階版可以見 這篇部落格 在某些情況下,dp 的時間複雜度仍然超出了題目的限制,這時我們就要考慮對其進行優化 斜率優化是對決策進行優化的一種方法 它適用於類似 f i min max a i b j c i d j 的方程 斜率優化由乙個單調佇列...
dp優化簡單總結
1.二分優化 使用二分查詢優化查詢效率 典型例題 lis dp i 儲存長度為 i 的上公升子串行中最小的結尾,可以用二分查詢優化到nlogn 2.數學優化 通過數學結論減少狀態數 例題1 hdu4623 題解 例題2 usaco4.11 題解大意是求10個數及其倍數最大不能表示的數 有數論結論證明...
單調佇列優化DP問題總結
小結 可見合理的使用哨兵可以簡化對邊界條件的處理 在單調佇列中使用哨兵,主要是在第1個列舉到的數,它依賴的滑動視窗此時為空,無法獲取到head,那麼此時的處理邏輯是什麼樣呢?一般來講從兩個方面來考慮 1 是不是視窗長度越界,需要出隊首元素?while hh tt q hh i m hh 這種情況下,...