動態規劃優化方法

2021-10-08 22:55:30 字數 850 閱讀 7629

之前我們學習過動態規劃方法,但是並沒有對dp進行系統細緻的優化。今天來看一下dp的優化方法。

做變換:

等式就可以看作一條直線,每個j都確定出乙個點(x, y),對於當前要求解的i,其斜率已確定(且隨i單增),要使dp[i]最大即要使這條直線過某乙個j形成的點並使得的截距最小。

假設之前已處理完前9個點,將他們畫在座標平面上,可以發現,不論當前點a[i](斜率)是多少,能使截距最小的點一定選在標出來的四個點形成的下凸包中。且當?_?1?2≤?≤?_?2?3時,選擇j2點最優。

可以用雙端佇列來維護這個下凸包,當前雙端佇列中按順序存放有j1~j4四個點。

判斷當前計算的i的斜率是否大於?_?1?2(佇列中前兩個點的斜率),若大於,則把隊首彈出,因為i的斜率會越來越大,隊首之後肯定也不會是最優轉移點,彈出後繼續判斷。然後取隊首作為轉移點,此時直線的截距一定最小。

設剛計算完的點為j5。

判斷?_?3?4(即佇列末尾兩個點形成的斜率)是否大於?_?3?5(j5與佇列末尾倒數第二個點的斜率),若大於則將隊尾彈出,因為加入j5後原隊尾已經不在下凸包上,之後肯定不會作為最優轉移點,彈出後繼續判斷。

將j5插入到佇列的尾部。

建議使用手寫的雙端佇列,因為會訪問到首部第二個元素和尾部第二個元素,用stl裡的deque會麻煩一點

動態規劃 斜率優化

一 引用 一般dp 方程可以轉化成 dp i f j x i 的形式,其中 f j 中儲存了只與 j相關的量。這樣的 dp方程可以用單調佇列進行優化,從而使得 o n 2 的複雜度降到 o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j ...

斜率優化動態規劃

fi min fj s i2 sj l 2 2 si s j l fi min f j s i2 sj l 2 2si sj l 形如這個式子關於i的項與關於j的項混雜 相乘 的狀態轉移方程,可以使用斜率優化來加速 接下來以優化這個式子為例說說斜率優化.將上方給出的式子去掉 min min,僅關於j...

動態規劃方法

1 思想 避免重複的計算,先將計算過的值儲存下來,如果發現有相同的步驟,直接將事先儲存好的值拿出來。動態規劃其實質上是通過開闢記錄表,記錄已求解過的結果,當再次需要求解的時候,可以直接到那個記錄表中去查詢,從而避免重複計算子問題來達到降低時間複雜度的效果。實際上是乙個空間換時間的演算法。動態規劃,在...