淺談線段樹優化DP
本篇隨筆淺談一下線段樹優化DP。
一、關於DP優化的兩種方式
DP算法是大家耳熟能詳的最優化算法之一。
有的時候,我們設計DP的時候,需要采取措施進行DP優化來適應題目對時間空間的要求。
一般來講,DP的優化有兩種方式:第一種是針對狀態設計進行優化。比如滾動數組優化一維。比如0/1背包優化枚舉,比如狀壓和倍增DP等等。
第二種是針對轉移過程進行優化,比如一次轉移是\(O(n)\)的,卡時間,就想辦法通過一些辦法把一次轉移的時間復雜度降低。
比如,對於一些數列問題,可以通過遞推公式進行通項公式的計算,進而做到\(O(n)\rightarrow O(1)\)的轉移。
還比如說,用一些數據結構維護轉移所需的一些信息,以達到優化轉移的效果。
二、線段樹優化DP的概念
在DP過程中架線段樹對DP的轉移進行優化,就被叫做線段樹優化DP。
三、例題體會
多講沒用,上題。
比如這道:
這道題是很經典的線段樹優化DP。設計狀態什么的都是次要的。轉移的時候,不加優化是一次\(O(n)\),優化后變成一次\(O(\log n)\),總復雜度變成:\(O(n\log n)\)。
通過這道題,我們總結一下線段樹優化DP的一半步驟。
一、弄清楚線段樹維護的是什么信息。
二、弄清楚線段樹維護的信息在轉移過程中是否有修改,怎么修改。
三、弄清楚線段樹維護的信息在轉移過程中是否隨狀態的更新而改變。
大約就是這樣。