要求:最優子結構:求解 i 需要 j k 兩個狀態,用到的一定是 j k 的最優解
無後效性:
只關心狀態值,不關心狀態是如何推出來的。
狀態一旦確定,不會受到之後階段的決策的影響
只關注 j k 的最優解,而不需要考慮是否有可能使用了公共的資源而導致最終解不合法
常見型別:
序列dp:
狀態 [ i ] 表示前 i 個元素組成的狀態。
狀態 [ i ] 表示用到了第 [ i ] 個元素時組成的狀態。
區間dp:
常見的轉移是列舉中間的斷點 k,拆分成 [ l , k ] 與 [ k + 1 , r ]
有時候可以用四邊形不等式優化
有時候性質特殊,可以從 [ l + 1 , r ] 或者 [ l , r − 1 ] 中的乙個轉移
數字dp:
按照數字的位數劃分狀態進行 dp
一般為求 [l,r] 中滿足條件 p(i) 的數字個數
通常來說上界會很大,暴力列舉會超時(比如 10^18)
條件 p(i) 通常與數字的大小無關,而與數字的組成相關
原始形式 —— f [ i ] [ 0 / 1 ],考慮到數字從高向低第 i 位,前面的數字是否達到上界(如數字上界為1234,前 3 位列舉了 123,則這一位只能列舉 1 ~ 4,而不是 0 ~ 9)
考慮dp時,先設計乙個最簡單的狀態,看看能不能轉移到下一狀態,若無法轉移,則考慮增加維度(如加上之前狀態對當前狀態產生的「影響」)
正推可能比逆推容易
概率dp:
設狀態 f [n] 表示距離目標還差 n 步時的期望
根據每一步決策的概率寫轉移方程 : f [ i ] [ j ] = p ∗ f [ i − 1 ] [ j ] + (1 − p) ∗ f [ i ] [ j − 1 ]
期望:e( x + 1 ) = e( x ) + 1
e( ( x + 1 ) 2 ) = e( x 2 ) + 2 * e( x ) + 1
有可能會自己轉移到自己,這時需要移項代數變形
狀壓dp:
一般會先將所有合法狀態搜出來,然後編上號進行 dp
記憶化搜尋:好寫
優化:轉移過程優化:
單調佇列:
f [ i ] = min + w( i )
l[i] 隨 i 單調不降, w( i ) 是轉移方程組僅和 i 有關的部分,g( j ) 是轉移方程中僅和 j 有關的部分
對於 k < j 有 g( k ) ≥ g( j ),那麼決策 k 就是毫無用處的,用單調佇列維護 遞增
斜率優化:
存在 i j 的交叉項
乙個數列 a 分成若干組,乙個組 [l, r] 的代價為 m + ( ∑( l, r ) ai ) 2,求分組的最小代價。
• f [ i ] = min + m
減少冗餘狀態
根據 dp 方程尋找優化的方法,可以嘗試修改一下狀態的定義
計算過程優化:
部分和優化:字首和
矩陣快速冪:轉移方程中的係數為常係數,轉化為矩陣相乘 o(log n)
狀態設計優化:
交換答案與狀態:
lcs,n ≤ 1e6, m ≤ 1e3 —— 答案與第一維對調,通過預處理 a 的每一位的下乙個 a, b, . . . , z 出現的位置,o(m 2 + 26n)
寒假集訓總結2022
總算是安安靜靜沒有作孽度過了乙個完整的假期 可以說是很有提公升吧,關於省選難度的考試題也在不斷地找手感 波波說,靠聯賽優勢進隊的人很危險,的確說這樣的,所以我聯賽要有優勢,省選也要有優勢 這次集訓可以說是度過了我最特別的乙個生日了吧 本來以為我元宵節的生日,是永遠也不可能在學校過一次了 然而萬惡的疫...
2022寒假集訓day5
day5 五道棧的題加上字串。單調佇列 t1表示式括號匹配 洛谷p1739 假設乙個表示式有英文本母 小寫 運算子 和左右小 圓 括號構成,以 作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回 yes 否則返回 no 表示式長度小於255,左圓括號少於20個。一行 ...
2022寒假第一次作業彙總
這個作業屬於哪個課程 2022物件導向程式設計 這個作業要求在 2022面向程式物件設計寒假作業1 這個作業的目標 1 學習markdown語法 2 自我介紹 3 安裝並學學習git的基本使用 4 註冊github賬號,並建立倉庫,編輯自我介紹,並提交commit 5 選擇並配置乙個適合自己的ide...